-
2021-03-22 15:02:25
本文实例讲述了java Swing实现窗体添加背景图片的2种方法。分享给大家供大家参考,具体如下:
在美化程序时,常常需要在窗体上添加背景图片。通过搜索和测试,发现了2种有效方式。下面分别介绍。
1. 利用JLabel加载图片
利用JLabel自带的setIcon(Icon icon)加载icon,并设置JLabel对象的位置和大小使其完全覆盖窗体。这是一个很取巧的办法,代码非常简单,如下所示。
JLabel lbBg = new JLabel(imageIcon);
lbBg.setBounds(0, 0, frameSize.width, frameSize.height);
this.getContentPane().add(lbBg);
然而这种方法有几个要注意的点:
(1)不能使用布局管理器
此时你需要将布局管理器设置为null,然后精确控制所有控件的大小和位置。否则,JLabel无法完整覆盖窗体。
(2)应当先添加背景JLabel,再添加其它控件。否则其它控件将被JLabel所遮挡(为什么不是后添加的遮挡先添加的?)。
(3)由于控件及窗体的尺寸需要手动控制,因此无法对背景图片进行缩放。
2. 重载JPanel的paintComponent(Graphics g)方法
通过重载该方法,在JPanel的绘制阶段将指定图片绘制上去即可。由于背景是绘制出来的,因此不会对布局有任何影响。
示例代码如下:
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, 0, 0, d.width, d.height, this);
MainFrame.instance().repaint();
}
下面是一个完整的demo。
package frame;
import java.awt.Dimension;
imp编程客栈public ImagePanel(Dimension d, Image image) {
super();
this.d = d;
this.image = image;
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, 0, 0, d.width, d.height, this);
MainFrame.instance().repaint();
}
}
Dimension frameSize = new Dimension(500, 300);
ImageIcon imageIcon = new ImageIcon(this.getClass().getResource(
"/images/bg.jpg"));
public ImageFrame() {
// 设置窗体属性
setSize(frameSize);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setIconImage(imageIcon.getImage());
setUndecorated(true);
}
public void addImageByJLable() {
setLayout(null);
// 设置背景
JLabel lbBg = new JLabel(imageIcon);
lbBg.setBounds(0, 0, frameSize.width, frameSize.height);
this.getContentPane().add(lbBg);
addComponents();
setVisible(true);
}
public void addImageByRepaint() {
ImagePanel imagePanel = new ImagePanel(frameSize, imageIcon.getImage());
setContentPane(imagePanel);
addComponents();
setVisible(true);
}
private void addComponents() {
JButton btn1 = new JButton("haha");
btn1.setBounds(10, 20, 60, 30);
this.getContentPane().add(btn1);
JTextField jtf = new JTextField("22222222222");
jtf.setBounds(200, 100, 80, 30);
this.getContentPane().add(jtf);
http://www.cppcns.com }
public static void main(String[] args) {
// TODO Auto-generated method stub
ImageFrame imageFrame = new ImageFrame();
// imageFrame.addImageByJLable();
imageFrame.addImageByRepaint();
}
}
运行效果如下:
图1 使用JLabel加载图片效果
图1可见,使用JLabel时,由于未图片尺寸与窗体尺寸不一致,导致图片只显示出一部分;且有一个控件被遮挡了。注意:通过精细设置尺寸和添加控件顺序,可以达到较为满意的效果的。
图2 使用重绘方式加载图片
图2可见,不需要可以设置匹配尺寸和控件的添加顺序,即可得到比较满意的效果。
补充说明:Swing 重绘 repaint,updateUI区别
repaint
public void repaint()重绘此组件。
如果此组件是轻量组件,则此方法会尽快调用此组件的 paint 方法。否则此方法会尽快调用此组件的 update 方法。
注:有关 AWT 和 Swing 所用绘制机制的更多信息,包括如何编写最高效的绘制代码的信息 。
updateUI
public void updateUI()UIManager 发出的关于 L&F 已经更改的通知。用 UIManager 的最新版本替换当前的 UI 对象。覆盖: 类 JComponent 中的 updateUI另请参见: JComponent.updateUI()
可能大家都试过在swing的事件监听中动态添加组件,但是JFrame却不会动态显示,http://www.cppcns.com只有变大变小(实际是重画了)才会显示。repaint,updateUI可以,用validate发现也可以。
API中对repaint()方法是这样描述的,调度完当前所有未完成的事件后重新绘制该组件,所以repaint方法不总是马上执行。
package awtDemo;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public class Ss extends JFrame {
Container con = this.getContentPane();
JButton jb1 = new JButton("jb1");
JButton jb2 = new JButton("jb2");
JLabel jl1 = new JLabel("jl1");
FlowLayout gly = new FlowLayout();
JPanel jp = new JPanel(gly);
public Ss() {
con.add(jp);
jp.add(jb1);
jp.add(jb2);
MyListener ml = new MyLiwww.cppcns.comstener();
jb1.addMouseListener(ml);
this.setSize(300, 200);
this.setVisible(true);
}
private class MyListener extends MouseAdapter {
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
try {
JButton jb3 = new JButton("jb3");
jp.add(jb3);
// jp.updateUI();//可以正常显示
jp.repaint();//API中对repaint()方法是这样描述的,调度完当前所有未完成的事件后重新绘制该组件,repaint方法不总是马上执行,所以只有调整大小才可以显示。
//主要就是下面的invalidate和validate
//当然,用jp来invalidate和validatae也是可以的
// jp.invalidate();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
public static void main(String s[]) {
Ss sss = new Ss();
sss.setVisible(true);
}
}
swing重绘主要有四个关键方法:paint(),repaint(),revalidate(),paintImmediately();
而进行绘制时后它会依次调用update(),paint(),paintComponent(),paintBorder(),paintChildren()进行绘制;
那么repaint()方法为什么会延时呢?
调用repaint()会导致一个区域被增加到重绘列表队列中,且被预定重绘。产生一个防止到系统事件队列中的请求,
一旦该请求被处理,内部工具自动毁掉组件的paintImmediately()方法。然后该方法立即执行绘制;
也就是说通常情况下repaint()它是不会立即执行的,调用它后会有一个等待处理的过程。但repaint比较高效,会推迟实际的绘制并将多余的请求压缩到单个 paint 调用中。
所以如何解决它的repaint()延时问题呢?
1.让它立即执行:使用paintImmediately()。
2.使用SwingUtilities工具类中的invokeLater(Runnable doRun)方法;把你要在repaint()后执行的操作写在要执行的线程中;(它会把这个方法也加入到java内部事件队列中,它排在repaint()之后,所以一般情况下,它是等repaint()执行完之后才会执行,虽然这样达到效果,但并不理想);
更多关于java相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java字符与字符串操作技巧总结》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。
本文标题: Java Swing实现窗体添加背景图片的2种方法详解
本文地址: http://www.cppcns.com/ruanjian/java/211061.html
更多相关内容 -
Java swing窗体程序
2021-10-09 15:47:20想深入学习的朋友们可查阅有关资料或图书,比如《Java Swing图形界面开发与案例详解》——清华大学出版社。 早期的AWT(抽象窗口工具包)组件开发的图形用户界面,要依赖本地系统,当把AWT组件开发的应用程序移植到...Swing是GUI(图形用户界面)开发工具包,包括容器、组件和布局等。
早期的AWT(抽象窗口工具包)组件开发的图形用户界面,要依赖本地系统,当把AWT组件开发的应用程序移植到其他平台的系统上运行时,不能保证其外观风格,因此AWT是依赖于本地系统平台的。而使用Swing开发的Java应用程序,其界面是不受本地系统平台限制的,也就是说Swing开发的Java应用程序移植到其他系统平台上时,其界面外观是不会改变的。但要注意的是,虽然Swing提供的组件可以方便开发Java应用程序,但是Swing并不能取代AWT,在开发Swing程序时通常要借助与AWT的一些对象来共同完成应用程序的设计。
一、常用窗体
Swing窗体是Swing的一个组件,同时也是创建图形化用户界面的容器,可以将其它组件放置在窗体容器中。1. JFrame框架窗体
JFrame窗体是一个容器,在Swing开发中我们经常要用到,它是Swing程序中各个组件的载体。语法格式如下:JFrame jf = new JFrame(title);
当然,在开发中更常用的方式是通过继承java.swing.JFrame类创建一个窗体,可通过this关键字调用其方法。
而在JFrame对象创建完成后,需要调用getContentPane()方法将窗体转换为容器,然后在容器中添加组件或设置布局管理器,通常这个容器用来包含和显示组件。如果需要将组件添加至容器,可以使用来自Container类的add()方法进行设置。至于JPanel容器会在后面提到。
下面举一个JFrame窗体的例子。
import javax.swing.JFrame; import javax.swing.WindowConstants; public class JFrameDemo { public void CreateJFrame() { JFrame jf = new JFrame("这是一个JFrame窗体"); // 实例化一个JFrame对象 jf.setVisible(true); // 设置窗体可视 jf.setSize(500, 350); // 设置窗体大小 jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); // 设置窗体关闭方式 } public static void main(String[] args) { new JFrameDemo().CreateJFrame(); // 调用CreateJFrame()方法 } }
结果:
这就是一个500*350的窗体,用的是setSize()方法;标题为“这是一个JFrame窗体”,在实例化对象时就可以定义;窗体关闭方式见窗体右上角为“EXIT_ON_CLOSE”;窗体可视setVisible()方法中的参数为“false”或不写setVisible()方法时,此窗体不可见。常用的窗体关闭方式有四种,分别为“DO_NOTHING_ON_CLOSE”、“DISPOSE_ON_CLOSE”、“HIDE_ON_CLOSE”、“EXIT_ON_CLOSE”。第一种表示什么也不做就将窗体关闭;第二种表示任何注册监听程序对象后会自动隐藏并释放窗体;第三种表示隐藏窗口的默认窗口关闭;第四种表示退出应用程序默认窗口关闭。
下面再举一个用继承JFrame的方式编写的代码,并加入Container容器及JLabel标签import java.awt.Color; import java.awt.Container; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.SwingConstants; import javax.swing.WindowConstants; public class JFrameDemo2 extends JFrame{ public void init() { this.setVisible(true); // 可视化 this.setSize(500, 350); // 大小 this.setTitle("博客园"); // 标题 this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); // 关闭方式 JLabel jl = new JLabel("http://www.cnblogs.com/adamjwh/"); // 创建一个JLabel标签 jl.setHorizontalAlignment(SwingConstants.CENTER); // 使标签文字居中 Container container = this.getContentPane(); // 获取一个容器 container.add(jl); // 将标签添加至容器 container.setBackground(Color.YELLOW); // 设置容器背景颜色 } public static void main(String[] args) { new JFrameDemo2().init(); } }
结果:
这里继承了JFrame类,所以方法中实现时用this关键字即可(或直接实现,不加this)。1215行为创建JFrame框体;17、18行为JLabel标签,用与添加一个标签;2022行为Container容器,用getContentPane()方法为JFrame窗体获取容器,并用add()方法将JLabel标签添加到容器上。2. JDialog窗体
JDialog窗体是Swing组件中的对话框,继承了AWT组件中的java.awt.Dialog类。功能是从一个窗体中弹出另一个窗体。下面来看一个实例:
import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.WindowConstants; public class JDialogDemo extends JDialog { // 继承JDialog类 public JDialogDemo() { super(new MyJFrame(), "这是一个JDialog窗体", true); // 实例化一个JDialog类对象,指定其父窗体、窗口标题和类型 Container container = this.getContentPane(); container.add(new JLabel("http://www.cnblogs.com/adamjwh/")); this.setSize(500, 350); } public static void main(String[] args) { new JDialogDemo(); } } // 下面这部分内容包含监听器,可自行查阅资料 class MyJFrame extends JFrame { public MyJFrame() { this.setVisible(true); this.setSize(700, 500); this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); Container container = this.getContentPane(); container.setLayout(null); JButton jb = new JButton("点击弹出对话框"); // 创建按钮 jb.setBounds(30, 30, 200, 50); // 按钮位置及大小 jb.addActionListener(new ActionListener() { // 监听器,用于监听点击事件 @Override public void actionPerformed(ActionEvent e) { new JDialogDemo().setVisible(true); } }); container.add(jb); } }
结果:
当我们点击按钮时,触发点击事件,这时执行第42行的语句,创建一个JDialog的实例化对象,弹出一个窗口。这里出现了许多我们之前学过的知识,比如super关键字,在之前提到过,这里相当于使用了JDialog(Frame f, String title, boolean model)形式的构造方法;监听器的实现就是一个匿名内部类。
二、标签组件
在Swing中显示文本或提示信息的方法是使用标签,它支持文本字符串和图标。上面我们提到的JLabel就是这里的内容。1. 标签
标签由JLabel类定义,可以显示一行只读文本、一个图像或带图像的文本。JLabel类提供了许多构造方法,可查看API选择需要的使用,如显示只有文本的标签、只有图标的标签或包含文本与图标的标签等。因为上面已经出现过了,这里就不再举例了。常用语法格式如下,创建的是一个不带图标和文本的JLabel对象:
JLabel jl = new JLabel();
2. 图标
Swing中的图标可以放置在按钮、标签等组件上,用于描述组件的用途。图标可以用Java支持的图片文件类型进行创建,也可以使用java.awt.Graphics类提供的功能方法来创建。在Swing中通过Icon接口来创建图标,可以在创建时给定图标的大小、颜色等特性。注意,Icon是接口,在使用Icon接口的时候,必须实现Icon接口的三个方法:
public int getIconHeight() public int getIconWidth() public void paintIcon(Component arg0, Graphics arg1, int arg2, int arg3)
下面看一个用Icon接口创建图标的实例:
import java.awt.Component; import java.awt.Container; import java.awt.Graphics; import javax.swing.Icon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.SwingConstants; import javax.swing.WindowConstants; public class IconDemo extends JFrame implements Icon { private int width; // 声明图标的宽 private int height; // 声明图标的长 public IconDemo() {} // 定义无参构造方法 public IconDemo(int width, int height) { // 定义有参构造方法 this.width = width; this.height = height; } @Override public int getIconHeight() { // 实现getIconHeight()方法 return this.height; } @Override public int getIconWidth() { // 实现getIconWidth()方法 return this.width; } @Override public void paintIcon(Component arg0, Graphics arg1, int arg2, int arg3) { // 实现paintIcon()方法 arg1.fillOval(arg2, arg3, width, height); // 绘制一个圆形 } public void init() { // 定义一个方法用于实现界面 IconDemo iconDemo = new IconDemo(15, 15); // 定义图标的长和宽 JLabel jb = new JLabel("icon测试", iconDemo, SwingConstants.CENTER); // 设置标签上的文字在标签正中间 Container container = getContentPane(); container.add(jb); this.setVisible(true); this.setSize(500, 350); this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); } public static void main(String[] args) { new IconDemo().init(); } }
-
java swing开发窗体程序开发(一)GUI编程
2019-04-05 21:37:27Java SWing就是java提供的一个类库专门用于开发窗体程序的,相对于C#的winform,java swing的开发要比C#更加麻烦,他不像C#拥有可视化的界面编辑工具 而是需要像QT一样纯代码式GUI编程。java的好处就是通用性强,跨...Java SWing就是java提供的一个类库专门用于开发窗体程序的,相对于C#的winform,java swing的开发要比C#更加麻烦,他不像C#拥有可视化的界面编辑工具
而是需要像QT一样纯代码式GUI编程。java的好处就是通用性强,跨平台,这个java窗体程序做好之后,哪都可以用。然而C#的winform只能运行在有.net框架上
的平台,然而.net支持最好的,也就只有windows了。C#的开发效率更高以下讲解Java swing的开发
(一)第一个java swing程序
public static void main(String[] args) { //java Swing学习 //生成窗口 JFrame windows1=new JFrame("窗口1"); JFrame windows2=new JFrame("窗口2"); Container container1=windows1.getContentPane();//获得这个窗口的内容面板 container1.setBackground(Color.blue);//设置背景颜色 windows1.setBounds(60,100,188,108);//设置位置大小 windows2.setBounds(260,100,188,108); windows1.setVisible(true);//可视性设置 windows1.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//设置按x后的操作.[这个只是关闭那个窗口] windows2.setVisible(true); windows2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置按x后的操作.[这个是关闭整个程序,将会关闭所有窗口] }
需要注意的是,在设置位置和大小时,即setBounds,一共有4个参数,前面两个是坐标信息,即x,y坐标。对于屏幕坐标系,这个坐标原点在屏幕左上角,以下为y正轴,右为x正轴
还有就是DISPOSE_ON_CLOSE EXIT_ON_CLOSE的区别。
运行的效果如下
(二)带有菜单栏,菜单条,和子菜单的窗体程序
首先要知道几个常见类和函数
JMenuBar:代表菜单条,他需要被设置给JFrame窗体中
JMenu:代表菜单,他需要被放在菜单条中
JMenuItem:代表菜单项,续杯放在菜单中。
Icon:代表图标,使用new ImgeIcon(“文件路径”);//使用绝对路径,这里由于是linux所以没有盘符
常用函数
JFrame:
setJMenuBar(JMenuBar menuBar);//将菜单条设置给窗口
JMenu:
add(JMenuItem);//在菜单中添加菜单项
add(JMenu);//在菜单中添加子菜单
addSoearator();//添加分割线
JMeunItem:
其的双参构造方法:第一个是菜单项名字,第二个是菜单项图标/** * 创建一个带菜单条,菜单项,子菜单的窗口 */ public class MainForm extends JFrame { JMenuBar menuBar;//菜单条 JMenu menu1,menu2,submenu;//菜单 JMenuItem item1,item2;//菜单项 /** * 创建这个窗口的构造函数 * @param title 窗口名字 * @param posX X坐标 * @param posY Y坐标 * @param width 宽 * @param height 高 */ public MainForm(String title,int posX,int posY,int width,int height) { init(title); //setIconImage();//设置窗体图标 setLocation(posX,posY);//该函数继承至JFrame用于设置位置 setSize(width,height);//该函数继承至JFrame用于设置大小 setVisible(true);//同上,设置可视性 setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//同上,设置关闭时的操作 } private void init(String title) { setTitle(title);//继承至JFrame,设置窗口标题 menuBar =new JMenuBar();//实例化菜单条 menu1=new JMenu("菜单1");//实例化菜单 menu2=new JMenu("菜单2");//同上 submenu=new JMenu("子菜单1");//同上 item1=new JMenuItem("菜单项1",new ImageIcon("/home/zuikaku/图片/1.png"));//实例化菜单项并设置图标 item2=new JMenuItem("菜单项2",new ImageIcon("/home/zuikaku/图片/1.png"));//实例化菜单项并设置图标 item1.setAccelerator(KeyStroke.getKeyStroke('A'));//设置快捷键 item2.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,KeyEvent.CTRL_MASK));//设置组合快捷键 menu1.add(item1);//将菜单项添加入菜单中 menu1.addSeparator(); menu1.add(item2);//同上 menu1.add(submenu);//将菜单加入菜单中,即作为其子菜单 submenu.add(new JMenuItem("子菜单项1",new ImageIcon("/home/zuikaku/图片/1.png")));//子菜单中添加菜单项 submenu.add(new JMenuItem("子菜单项2",new ImageIcon("/home/zuikaku/图片/1.png")));//子菜单中添加菜单项 menuBar.add(menu1);//菜单条中添加菜单 menuBar.add(menu2);//同上 setJMenuBar(menuBar);//将该菜单条设置给这个窗口 } }
实例化这个MainForm的效果就是
(三)Java Swing中的常用组件
组件的作用就是与人交互,他们就是用来显示提供给用户的信息或捕捉。这些组件都继承至JComponent
常用的有
JTextField:单行文本输入
JTextArea:多行文本输入
JButton:按钮
JLabel:标签,用于显示提示信息
JCheckBox:复选框
JRadioButton:单选框-需要归组后才能实现单选
JComboBox:下拉列表
JPasswordField:密码框
需要注意的是,这些组件new出来后,是不会显示的,要将其添加add到这个窗体中,才会显示
/** * 展示java swing中的常见组件 */ public class UserInputForm extends JFrame{ JLabel usernameLabel; JLabel passwordLabel; JLabel personalInfoLabel; JTextField usernameInput; JPasswordField passwordInput; JTextArea personalInputArea; JCheckBox checkBox1; JCheckBox checkBox2; JRadioButton men; JRadioButton women; JComboBox<String> countryComboBox; ButtonGroup buttonGroup;//用于单选框的归组 JButton submitBtn; public UserInputForm(String title,int posX,int posY,int width,int height) { init(); setTitle(title); setLocation(posX,posY); setSize(width,height); setVisible(true); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); } private void init() { setLayout(new FlowLayout());//设置布局 usernameLabel=new JLabel("用户名"); passwordLabel=new JLabel("密码"); personalInfoLabel=new JLabel("个人信息"); usernameInput=new JTextField(); passwordInput=new JPasswordField(); personalInputArea=new JTextArea(); checkBox1=new JCheckBox("哈哈"); checkBox2=new JCheckBox("嘻嘻"); men=new JRadioButton("男"); women=new JRadioButton("女"); buttonGroup=new ButtonGroup(); buttonGroup.add(men); buttonGroup.add(women); countryComboBox=new JComboBox<String>(); countryComboBox.addItem("下拉选项1"); countryComboBox.addItem("下拉选项2"); submitBtn=new JButton("提交"); //将这些组件加入到这个窗口中-才可以显示 add(usernameLabel); add(passwordLabel); add(personalInfoLabel); add(usernameInput); add(passwordInput); add(personalInputArea); add(checkBox1); add(checkBox2); add(men); add(women); add(countryComboBox); add(submitBtn); } }
效果如下
(四)常见容器(面板)【中间层容器】
刚刚是将所有的组件添加到继承至JFrame的类中,JFrame叫做底层容器,然而在实际开发和为了更好的使用【例如实现同一个窗口切换选项卡有不同的面板】
这些组件并不是直接添加在底层容器。而是添加到中间层容器。当然,这个中间层容器也必须添加到底层容器JFrame中才会启作用。否则显示不出来
即必须有一个类继承至JFrame,且这个类将面板或是布局,add进去。然后实例化这个继承至JFrame的类,才看的到。
1:JPanel面板:常用JPanel作为一个面板,最普通的面板,向该面板中添加组件。默认布局是FlowLayout
2:JTabbedPane可切换选项卡面板:特点,向该面板中添加组件时,会可以为这个组件添加选项卡。即通过选项卡可以切换不同的组件(也可以是子面板JPanel),相当于,第一个选项卡点击
显示第一个界面,第二个选项卡点击,不开新窗口,就在该窗口上显示第二个界面。使用add(String text,Component c);//这个函数来指定选项卡名字和组件之间的对应关系
选项卡的位置在构造JTabbedPane对象时可以指定,其构造函数参数为int类型,实际是一个静态常量,枚举表示的是选项卡的位置JTabbedPane.Bottom/Top/LEFT/RIGHT
3:JSrollPane滚动面板:其只可以添加一个组件,通常和JTextArea配合使用,作为文本输入栏的滚动条
JScrollPane scroll=new JScrollPanel(new JTextArea());4:JSplitPane拆分面板:即面板分为两部分,可以按左右分割,左右各一个,也可以按上下分割,上下各一个
构造方法
JSplitPane splitPanel=new JSplitpanel(int a,Component b,Conponent c);
其中a是个静态常量,代表是水平分割还是垂直,分别是JSplitpane.HORIZONTAL_SPLIT和JSplitpane.VERTICAL_SPLIT5:JLayeredPane分层面板:用于处理组件重叠问题
需要注意的是,这个层并不是可以自己定义,和Unity的OrderInLayer和SortLayer不同。JavaSwing中总共就定义了5层,从低到高,分别是
DEFAULT_LAYER,PALETTE_LAYER,MODAL_LAYER,POPUP_LAYER,DRAG_LAYER
同一位置,高层的会覆盖显示底层的。对于同层的,后来的会覆盖新来的
//使用add(Component, layer)可以添加组件并设置值
setLayer(Component c,int layer));//可以重新设置layer
getLayer(Component c);//可以获得一个组件的Layer(五)设置布局
即组件在面板上的布局
容器/面板通过调用setLayout(布局对象)来设置布局
1:FlowLayout布局:表示默认居中对齐,使用该布局方式的容器,用add函数向里面加组件,就会根据先后顺序从左向右排列,一行排完后就提行
使用该布局方式,组件自身的setSize将不会有用,要改变大小只能通过setPreferredSize(DimensionpreferredSize)
button.setPreferredSize(new Dimension(20,20)))该布局方式的对齐方式可以更改,FlowLayout对象调用setAlignment(int align);//使用该函数修改对齐方式,传入的参数是一个静态常量,FlowLayout.LEFT,FlowLayout.CENTER
FlowLayout.RIGHT
2:BorderLayout布局:表示将这个容器划分为5个部分,东西南北中【上下左右中】
中间的区域最大,所加入的组件都应该指明其属于哪一个区域。东南西北中用静态常量表示的:分别是EAST.WEST,SOUTH,NORTH。
//使用方法
容器对象.add(组件对象,BorderLayout.East)需要注意的是,使用这种布局方式,组件不能超过5个,同一个区域加入过多次组件以最后一次为准。如果一个区域实在需要多个组件
那么就用嵌套的方式,即加个面板进去,再这个面板里面再加组件
3:CardLayout布局:表示其可以添加多个组件,但只能显示一个。这些组件层叠的放在一起,只有最前面可以显示。
顺序并不是栈,而是队列,即第一个添加进去的组件,显示在最前面,后面的一次往后排。且显示出来的组件将会占据该容器的所有空间
使用该种布局的容器在添加组件时
add(String s,Component c)
s只是一个代号,方便以后显示这个组件时找到
cardlayout对象.show(容器对象,代号s)其实也有快捷方式,如果知道顺序,但未知代号,或者是没有设置代号,可以通过
caradLayout对象.frist(容器对象)的方式,还有last(),next(),previous()的方式
4:GridLayout布局:即格子布局,将容器划分为若干行和若干列,在小格子添加组件
需要注意的是:这些小格子的大小不能改,所有格子强制大小相同,且排列顺序是从左到右,一行排完后再提行
5:null布局:表示空布局
使用时 容器对象.setLayout(null)即可
这种模式下,不限制组件的个数,每个组件都可以设置其自己的大小和位置location。当然组件可以通过setBounds()函数来设置位置和宽高。
通常在容器add©//c代表一个组件。然后c调用自己setBounds来设置
6:Box布局:盒子布局
盒子布局一共有两种,1是水平盒子Box.creatHorizontalBox()。2是垂直盒子Box.creatVerticalBox().
其中水平盒子中添加的组件都是水平排列,垂直盒子中添加的组件都是垂直排列的
想在水平或垂直的组件间添加间距
可以在盒子中Box对象.add(Box.creatHorizontalStrut(10));//创建间距为10的水平间隔,Box.creatVerticalStrut(10)则代表垂直方向上的间隔
以下是一个演示案例/** * 格子布局演示 */ public class GridPanel extends JPanel { public GridPanel() { GridLayout gridLayout=new GridLayout(12,12);//生成格子布局对象。构造时设置格子 setLayout(gridLayout);//为该panel设置布局 JLabel [][]labels=new JLabel[12][12];//格子中的组件 for(int i=0;i<=11;i++) { for(int j=0;j<=11;j++) { labels[i][j]=new JLabel(); if((i+j)%2==0) labels[i][j].setText("A"); else labels[i][j].setText("B"); add(labels[i][j]);//将该组件加入到面板中 } } } } /** * 自定义的空布局面板 */ public class NullPanel extends JPanel { JButton button; JTextField textField; public NullPanel(){ setLayout(null);//设置布局类型 button=new JButton("确定");//实例化组件 textField=new JTextField();//实例化组件 //将组件加入该面板 add(button); add(textField); //设置他们大小和位置 textField.setBounds(100,30,90,30); button.setBounds(190,30,66,30); } } /** * 用于演示的主面板-其自身也使用了BorderLayout布局 */ public class MixedForm extends JFrame { private GridPanel gridPanel;//自定义的格子面板对象 private NullPanel nullPanel;//自定义的空布局面板对象 private JTabbedPane tabbedPane;//选项卡面板 public MixedForm() { gridPanel=new GridPanel();//实例化格子面板对象 nullPanel=new NullPanel();//实例化空布局面板对象 tabbedPane=new JTabbedPane();//实例化选项卡面板 //将两个自定义的面板加入到选项卡面板下,通过选项卡可进行切换 tabbedPane.add("格子布局面板",gridPanel); tabbedPane.add("空布局面板",nullPanel); //设置这个MixedForm的布局模式为BorderLayout setLayout(new BorderLayout()); //将这个选项卡面板添加入该MixedForm的中区域 add(tabbedPane,BorderLayout.CENTER); //随便填充几个,将东南西北填充完 add(new JButton("东"),BorderLayout.EAST); add(new JButton("南"),BorderLayout.SOUTH); add(new JButton("西"),BorderLayout.WEST); add(new JButton("北"),BorderLayout.NORTH); //设置MixedForm的相关属性 setBounds(10,10,570,390); setVisible(true); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); //validate();//验证组件,可以有 } } //启动类 public class Main { public static void main(String[] args) { MixedForm form=new MixedForm(); } }
注意在设置很多布局之后调用一次
void validate()验证此容器及其所有子组件。函数,更新验证。【可以有】
效果如下图
盒子布局的展示
代码如下public class UserInputPanel extends JFrame { private Box userInputBox;//用户输入部分的盒子,主要包含了用户名和密码,垂直排列 private Box usernameBox;//用户名盒子,包含两个部分,一个label一个TextFiled,水平排列 private Box passwordBox;//密码盒子,包含两个部分,一个label一个passwordField,水平排列 private Box buttonBox;//按钮盒子,包含登录和忘记密码两个按钮,水平排列 private JLabel userNameLabel;// private JLabel passwordLabel;//两个label组件提示用户 private JTextField userNameInput;//用户名输入框 private JPasswordField passwordInput;//密码输入框 private JButton loginBtn;//登录按钮 private JButton forgetPasswordBtn;//忘记密码按钮 public UserInputPanel() { //实例化所有的对象 userNameLabel=new JLabel("用户名"); passwordLabel=new JLabel("密码"); userNameInput=new JTextField(); passwordInput=new JPasswordField(); loginBtn=new JButton("登录"); forgetPasswordBtn=new JButton("忘记密码"); userInputBox=Box.createVerticalBox();//内部组件,垂直排列 buttonBox=Box.createHorizontalBox();//内部组件,水平排列 usernameBox=Box.createHorizontalBox();//内部组件,水平排列 passwordBox=Box.createHorizontalBox();//内部组件,水平排列 //将用户名相关内容加入用户名盒子 usernameBox.add(userNameLabel); usernameBox.add(Box.createHorizontalStrut(10));//输入框与label的横向间隔 usernameBox.add(userNameInput); //将密码相关内容加入密码盒子 passwordBox.add(passwordLabel); passwordBox.add(Box.createHorizontalStrut(10));//输入框和label的横向间距 passwordBox.add(passwordInput); //将用户名盒子和密码盒子加入用户输入userInputBox盒子 userInputBox.add(usernameBox); userInputBox.add(Box.createVerticalStrut(10));//两行之间的间距 userInputBox.add(passwordBox); //将两个按钮加入到按钮盒子 buttonBox.add(Box.createHorizontalStrut(20));//第一个按钮和左边界的距离 buttonBox.add(loginBtn); buttonBox.add(Box.createHorizontalStrut(10));//两个按钮之间的间距 buttonBox.add(forgetPasswordBtn); //这个面板为空布局 //设置这两个大盒子userInputBox和buttonBox的位置 setLayout(null); setBounds(50,50,500,400);//该窗口本身的位置和大小 //加入这两个大Box add(userInputBox); add(buttonBox); //设置这两个大Box的位置和大小 userInputBox.setBounds(20,20,400,100); buttonBox.setBounds(20,200,400,100); setVisible(true); setDefaultCloseOperation(DISPOSE_ON_CLOSE); validate(); } }
执行的效果如下
就此,界面的相关内容介绍的差不多了。下面介绍最重要的"事件"
可以关注我的博客,观看后续学习记录
下一节:java swing 窗体程序开发(二)事件(Action,Item,Document)
https://blog.csdn.net/tanyu159/article/details/89082367【!!!】欢迎关注我的个人线上课堂https://www.zuikakuedu.cn,内含JavaWeb与Unity游戏开发实战教程,完全免费!,Csdn博客涉及的课程资料也在该网站上
-
Java Swing高级组件——桌面面板和内部窗体
2020-05-16 14:58:39桌面面板和内部窗体 在一个GUI应用程序中需要使用多个窗口,针对这些窗口可以有两种管理策略,一种是每个窗口都是一个独立的窗体,优点是可以通过系统主窗体上的按钮及快捷键浏览所有窗口;另一种是提供一个主窗体,...桌面面板和内部窗体
在一个GUI应用程序中需要使用多个窗口,针对这些窗口可以有两种管理策略,一种是每个窗口都是一个独立的窗体,优点是可以通过系统主窗体上的按钮及快捷键浏览所有窗口;另一种是提供一个主窗体,然后将其他窗口放在主窗体中,优点是窗口比较整齐。
在利用第二种策略管理窗口时,必须使用 JDesktopPane 类和 JInternalFrame 类(桌面面板类和内部窗体类)。 JDesktopPane 类是一个容器类,用来创建一个虚拟桌面; JInternalFrame 类是一个轻量级对象,用来创建支持拖动,关闭,图标化,调整大小,标题显示和菜单栏的内部窗体。
JDesktopPane 类中的常用方法
方法 说明 getAllFrames() 以数组的形式返回桌面中当前显示的所有 JInternalFrame getSeletedFrame() 获得桌面当前被选中的 removeAll() 从桌面中移除所有的 JInternalFrame remove(int index) 从桌面中移除位于指定索引位置的 JInternalFrame setSelectedFrame(JInternalFrame f) 设置指定的 JInternalFrame setDragMode(int dragMode) 设置窗体的拖动模式,入口参数的可选静态常量有LIVE_DRAG_MODE 和 OUTLINE_DRAG_MODE JInternalFrame 类
JInternalFrame 类创建构造方法时,可设置的入口参数最多为5个。
JInternalFrame(String title, boolean resizable, boolean closable, boolean maximizable, boolean iconifiable)
参数说明:
title:为内部窗体的标题。
resizable:设置是否允许自由调整大小,设为 true 表示允许,设为 false (默认值)表示不允许。
closable:设置是否提供“关闭”按钮,设为 true 表示提供,设为 false (默认值)表示提供。
maximizable:设置是否提供“最大化”按钮,设为 true 表示提供,设为 false (默认值)表示提供。
iconifiable:设置是否提供“最小化”按钮,设为 true 表示提供,设为 false (默认值)表示提供。JInternalFrame 类中的常用方法
方法 说明 setResizable(boolean b) 设置是否允许自由调整大小 setClosable(boolean b) 设置是否提供关闭按钮 setMaximizable(boolean b) 设置是否提供“最大化”按钮 setIconifiable(boolean b) 设置是否提供“最小化”按钮 setSelected(boolean selected) 设置窗体是否被激活,设为 true 表示激活,设为 false (默认值)则表示不激活窗体 isMaximum() 查看窗体是否处于最大化状态 isIcon() 查看窗体是否处于最小化状态 isClosed() 查看窗体是否已经被关闭 setFrameIcon(Icon icon) 设置窗体标题栏显示的图标 创建一个桌面面板与内部窗体,代码如下:
package study.czm; import java.awt.Container; import javax.swing.JDesktopPane; import javax.swing.JFrame; import javax.swing.JInternalFrame; public class Study { public static void main(String[] args) { JFrame jf = new JFrame(); jf.setTitle("表格组件"); jf.setSize(600, 500); jf.setLocationRelativeTo(null); jf.setDefaultCloseOperation(jf.EXIT_ON_CLOSE); Container c = jf.getContentPane(); JDesktopPane desktopPan = new JDesktopPane();// 创建桌面面板对象 desktopPan.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);// 设置内部窗体的拖拽方式 c.add(desktopPan); // 创建内部窗体 JInternalFrame inFrame1 = new JInternalFrame("第一个内部窗体", true, true, true, true); JInternalFrame inFrame2 = new JInternalFrame("第二个内部窗体", true, true, true, true); JInternalFrame inFrame3 = new JInternalFrame("第三个内部窗体", true, true, true, true); desktopPan.add(inFrame1); inFrame1.setBounds(50, 50, 200, 200); inFrame1.setVisible(true); desktopPan.add(inFrame2); inFrame2.setBounds(90, 90, 200, 200); inFrame2.setVisible(true); desktopPan.add(inFrame3); inFrame3.setBounds(130, 130, 200, 200); inFrame3.setVisible(true); jf.setVisible(true); } }
运行效果:
-
Java Swing实现让窗体居中显示的方法示例
2021-03-06 02:43:21本文实例讲述了java swing实现让窗体居中显示的方法。分享给大家供大家参考,具体如下:swing组件是awt组建的增强组件,是功能强大的“轻量级组件”。这里来简单介绍一下swing实现窗体居中显示的方法。其他不多说,... -
java Swing给一个窗体增加快捷键实例源码介绍
2021-02-26 21:16:12java Swing给一个窗体增加快捷键实例源码介绍。熟练运用一些快捷键的话,会大大增加效率,那么使用Swing编程该如何添加快捷键呢?下面就来实现他。一般来讲,快捷键一定是要被绑定到某一个组件上面的,并且在这个... -
JavaSwing | JFrame 框架与窗体
2020-01-07 20:50:37显示一个空白的窗体: import javax.swing.*; public class SimpleFrame { public static void main(String[] args) { MyFrame frame = new MyFrame(); frame.setVisible(true); } } class MyFrame ... -
利用JAVA SWING 编程,要在当前窗体中显示如下信息提示框,则需要编写的代码
2021-02-28 09:53:56【单选题】在计算机网络中,通常把提供并管理共享资源的计算机称为 ( )【单选题】计算机内部存储汉字,使用 ( ) 。【单选题】一个ASCII码字符用几个 Byte 表示 ()【单选题】运行Word时,键盘上用于把光标移动到行首位置... -
JAVA实现圆角窗体 .
2021-02-26 15:12:54现在开发一个窗体程序,经常要求用圆角窗体。而在Windows 经典外观下,直接写出来的窗体却是方型...通过sun的内部api(包含在jdk中)来实现。这里只需调用一个方法就OK:AWTUtilities.setWindowShape(win,new RoundRect... -
Swing窗体程序设计:布局Layout
2021-11-13 14:04:23布局(Layout),是Swing窗体程序设计の至关重要的东西。 譬如说,你去看一个网站,你会怎么判断这个网站使人舒不舒服?当然是看这个网站排兵布阵得好不好看喽,就像csdn写博客的地方,最上面是“发布文章”的... -
Java实用教程第18讲javaswing.ppt
2021-03-17 14:57:12《Java实用教程第18讲javaswing.ppt》由会员分享,可在线阅读,更多相关《Java实用教程第18讲javaswing.ppt(25页珍藏版)》请在人人文库网上搜索。1、第18讲 Java Swing,18.1 Swing 入门 18.2 容器 18.3 布局管理 ... -
JavaSwing编程总结
2021-09-22 14:52:00都2021年了,还有人用JavaSwing?这只是我的一个爱好,我喜欢做界面开发,但是又只有Java还学的不错,大部分Java书籍中对JavaSwing介绍的都比较一般,我便找了《Java2图形设计卷IISwing》介绍的还算不错,正好中秋节... -
java swing实现简易计算器
2020-10-06 15:02:39参考蓝桥实验楼的计算器代码,构建一个简易的计算器 前言 实现的功能 (1)一般的计算,先乘除后加减,如2+3-4/2=3 (2)对0为除数的情况(6/0)、只输入一个操作数一个符号就计算的情况(6+=)作出提示 (3... -
Java Swing 中三种事件处理方法之比较(转)
2021-02-26 20:13:50Swing是目前Java中不可缺少的窗口工具组,是用户建立图形化用户界面(GUI)程序的强大工具。Java Swing组件自动产生各种事件来响应用户行为。如当用户点击按钮或选择菜单项目时,Swing组件会产生一个ActionEvent。... -
java swing 连接mysql_Java swing项目-图书管理系统(swing+mysql
2021-03-14 22:30:26(一)java Swing的学习。(1)学习如何安装windowbuilder插件的安装。<1>在eclipse中点击help<2>在help的下拉选中选择install new software,弹出插件的添加界面<3>点击add,在弹出如下界面:<4&... -
JavaSwing中的重绘
2021-02-28 09:50:531.重绘概念如果未重绘,当界面发生形状大小改变的时候,界面上面已经...3.具体用法每个组件或者窗体都有paint方法,想重绘哪个组件的paint方法,就重写哪个组件的paint。4.关于repaint方法由于自己类本身没有repaint... -
java swing窗口放置屏幕中央问题思考
2021-03-01 06:55:52注意以下部分成功的前提条件是:pack(),必须放在以下代码之前执行,否则pack()置于之后将会覆盖前面的位置设置,前面的代码就失效了.这就是一直折磨我的问题.使主窗口居中一般使用下面的方法:第一种方法int ... -
JavaSwing_4.10: JInternalFrame(内部窗口)
2017-09-24 21:14:31本文链接: ... Java Swing 图形界面开发(目录) 1. 概述 官方JavaDocsApi: javax.swing.JInternalFrame JInternalFrame,内部窗口。 JInternalFrame 支持在 JFrame 窗口内部显示一个完整的子... -
java中给窗体加上背景图片
2021-03-10 06:26:54import java.awt.event...import javax.swing.*;import java.awt.*;public class BackgroundImage extends JFrame{JScrollPane scrollPane;ImageIcon icon;Image image;public BackgroundImage(){icon = new ImageIc... -
Java Swing 弹出对话框的使用
2021-03-08 20:03:12Swing中提供了JOptionPane类来实现类似Windows平台下的MessageBox的功能,利用JOptionPane类中的各个static方法来生成各种标准的对话框,实现显示出信息、提出问题、警告、用户输入参数等功能。这些对话框都是模式... -
Swing的中自定义的窗体、内部窗体样式的设置
2009-03-24 20:42:11本示例中使用6行代码左右实现了窗体和内部窗体换肤效果,以及让窗体不能调整大小、窗体置中,以及除去窗体的装饰条--看不到最小化、最大化和关闭按钮,以及光标的样式等的功能。 因为Apple的皮肤没有在网上找它相应... -
Java AWT/Swing实现不规则窗体和控件
2019-05-09 05:27:28由于是自学,又是大专,没有科班的基础,所以不是很care算法和数据结构,因为Java可以快速作出一个肉眼可以看到的UI,所以我选择了Java而不是C/C++,同时由于MFC这些和微软的系统强相关,也就是说,同时放弃了VC++。... -
第四节 Java Swing事件处理
2021-02-12 13:29:17在Swing事件处理中可以使用ActionListener接口处理按钮的动作事件,ActionListener接口只定义了一个方法 Void actiongPerformed(ActionEvent e)//发生操作时调用 是用以上接口监听按钮的单击事件 import java.awt... -
java窗体Swing效果体验(并没有什么卵用)
2017-08-03 20:39:04代码(插入的图片没有显示 可能是图片大小问题) import java.awt.BorderLayout; import java.awt.Button; import java.awt.Panel; import java.awt.TextField; import java.awt.Window; import java.awt.event.... -
Java Swing入门基础
2021-03-05 23:57:46前言:当我们学习过了java中的基本语法,并且熟悉java的面向对象基础以后,我们就可以开始简单的Swing程序的设计,用过Vb的朋友可能会被它的简单的设计用户界面方法所吸引,只需要拖几个控件到窗体上,为每个空件编写... -
博为峰Java技术文章 ——JavaSE Swing JInternalFrame内部窗体面板II
2021-03-18 10:54:53我们来设计一个JInternalFrame实例,实例代码如下:publicclassBWF{publicstaticintWIDTH=560;...publicstaticvoidmain(Stringargs[]){JFramejf=newJFrame("BWF-javaSwing教程");jf.setSize(WIDTH,HEIGHT);//创建一... -
对Java 中Swing的小总结
2021-02-25 19:27:26最近把Swing里的内容稍微看了一下,Swing里的基本元素有:1.容器顶层容器顶层容器常见的有两种:I.窗体(JFrame),它可以直接出现在系统桌面上,其它组件必须直接或间接借助顶层容器才能显示出来。II.对话框(JDialog)...