JAVA Swing 开发
AWT 创建和使用的界面或按钮具有本地外观的感觉,绘制出的界面不完全具备跨平台性,操作系统不同绘制出来的界面可能不同,Swing与本地图形库没有太大的关系,也就是说,不管什么操作系统只要使用了Swing 绘制界面,显示都是一样的,Swing具有跨平台性,而且能绘制比AWT更丰富的图形界面,虽然Swing提供的组件可以更方便地开发Java应用程序,但是Swing 并不能取代AWT,在开发Swing程序时通常借助AWT的一些对象来共同完成应用程序的设计。
java.awt包中有一个container类,JComponent是它的子类,大部分Swing组件都是JComponent直接或间接类,Swing的体系结构如下:
JComponent抽象类的实现:
Swing的组件大部分和AWT类似,只是名字前面加了一个J,JFrame,JDialog,Jwindow都是Window的子类,其中JWindow很少使用。
JFrame
JFrame窗体是一个容器,它是Swing程序中各个组件的载体,可以将JFrame看做是承载这些Swing组件的容器,可以通过继承JFrame类创建一个窗体,在这个窗体中添加组件,同时为组件设置事件,由于该窗体继承了Frame类,所以他拥有最大化,最小化,关闭按钮。
JFrame窗体与Frame窗体有所不同,Frame窗体需要注册监听事件实现窗体关闭功能,JFrame只需要调用setDefaultOperation(int operation)方法,Java提供了集中可设置的常量用于关闭窗体,封装在javax.swing.WindowConstants中:
DO_NOTHING_ON_CLOSE(0) :无操作的默认窗体关闭操作
DISPOSE_ON_CLOSE (2): 移除窗体的默认窗体关闭操作
HIDE_ON_CLOSE(1):隐藏窗体的默认窗口关闭操作
EXIT_ON_CLOSE(3): 退出应用程序的默认关闭窗体操作
代码示例:
import javax.swing.*;
import java.awt.*;
public class TestJFrame {
public static void main(String[] args) {
JFrame jFrame=new JFrame("JFrame窗体");
JButton jButton=new JButton("按钮");
jFrame.add(jButton); //添加按钮
jFrame.setLayout(new FlowLayout()); //设置布局
jFrame.setSize(200,150) ;
//Frame窗体需要注册监听事件实现窗口关闭功能,内部可以使用javax.swing.WindowConstants中封装的常量
jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
jFrame.setVisible(true);
}
}
显示样式:
在运行程序后弹出JFrame窗体,在该代码中先创建了一个JFrame窗体,然后创建一个按钮并添加到窗体中,设置了窗体布局和大小,调用并setDefaultCloseOperation(int operation)方法设置窗体的关闭方式,最后设置窗体为可见,这是JFrame窗体的基本使用。
JDialog
JDialog是swing组件中的对话框,它继承了AWT 组件中的Dialog类,其功能是从一个窗体中弹出另一个窗体。与JFrame类似,实质上是另一种类型的窗体,JDialog类常用的构造方法如下:
代码示例:
package com.huawei.ncre;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TestJDialog {
public static void main(String[] args) {
//创建一个JFrame窗体:
JFrame jf=new JFrame("JFrame窗体");
//设置布局
jf.setLayout(new FlowLayout());
jf.setSize(300,500);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setVisible(true);
JButton jb1=new JButton("按钮1");
JButton jb2=new JButton("按钮2");
//添加按钮
jf.add(jb1);
jf.add(jb2);
final JLabel jLabel=new JLabel();
final JDialog jd=new JDialog(jf,"JDialog窗口");
jd.setSize(200,150);
jd.setLocation(50,60);
jd.setLayout(new FlowLayout());
jb1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
jd.setModal(true);
if (jd.getComponents().length==1){
jd.add(jLabel);
}
jLabel.setText("JDialog窗口1");
jd.setVisible(true);
}
});
jb2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
jd.setModal(false);
if (jd.getComponents().length==1){
jd.add(jLabel);
}
jLabel.setText("JDialog 窗口2");
jd.setVisible(true);
}
});
}
}
运行程序中弹出JFrame窗口,窗口中有两个按钮,分别是"JDialog窗口1" “JDialog窗口2” ,单击两个按钮,弹出相应对话框,在代码中,首先创建JFrame窗体,在窗体中添加两个按钮,于是弹出JDialog窗口,然后分别为两个按钮添加监听事件,单击按钮触发事件,弹出对应窗口,此时不能操作JFrame窗体,要先将弹出的JDialog对话框关闭后才可以操作。
中间容器
swing中不仅有JFrame和JDialog 这样的顶级窗口,还提供了一些中间容器,这些容器不能单独存在,只能放置在顶级窗口中,其中常用的两种为JPanel和JScrollPane:
JPanel:
JPanel 与AWT 中的Panel组件类似,它没有边框,不能被移动,放大,缩小或关闭,它的默认布局管理器是FlowLayout,JPanel的构造方法如下:
代码演示:
package com.huawei.ncre;
import javax.swing.*;
import java.awt.*;
public class TestJPanel {
public static void main(String[] args) {
//创建JFrame窗体
JFrame jf=new JFrame("JFrame窗口");
jf.setLayout(new GridLayout(2,1,10,10));
JPanel jp1 = new JPanel(new GridLayout(1, 3, 10, 10));
JPanel jp2 = new JPanel(new GridLayout(1, 2, 10, 10));
JPanel jp3 = new JPanel(new GridLayout(1, 2, 10, 10));
JPanel jp4 = new JPanel(new GridLayout(2, 1, 10, 10));
jp1.add(new JButton("按钮1"));
jp2.add(new JButton("按钮2"));
jp3.add(new JButton("按钮3"));
jp4.add(new JButton("按钮4"));
jf.add(jp1);
jf.add(jp2);
jf.add(jp3);
jf.add(jp4);
jf.setSize(200,150);
//设置窗体关闭方式
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setVisible(true);
}
}
样式:
运行程序弹出JFrame窗口,窗口内有4个按钮,例子中,先创建了JFrame窗体,然后设置布局,创建了4个中间容器JPanel,将4个按钮添加进4个Jpanel,最后将4个中间容器添加进JFrame窗体
JsrollPane:
在设置界面时,可能会遇到一个较小的容器窗体中显示较多内容的情况,这时可以使用JScrollPane面板,JScrollPane是一个带滚动条的面板容器,但是JScrollPane只能放置一个组件,并且不能使用布局管理器,如果需要在其中放置多个组件,需要将多个组件放置在JPanel面板容器中,然后将JPanel面板作为一个整体组件添加到JScrollPane面板中。