Swing
Swing
简介:
Swing 是一个为Java设计的GUI工具包。
Swing包括了图形用户界面(GUI)器件如:文本框,按钮,分隔窗格和表等。
Swing提供许多比AWT更好的屏幕显示元素。它们用纯Java写成,所以同Java本身一样可以跨平台运行,这一点不像AWT。它们是JFC的一部分。它们支持可更换的面板和主题(各种操作系统默认的特有主题),然而不是真的使用原生平台提供的设备,而是仅仅在表面上模仿它们。这意味着你可以在任意平台上使用JAVA支持的任意面板。轻量级组件的缺点是执行速度较慢,优点就是可以在所有平台上采用统一的行为。
总的来说,我们可以这样认为:
AWT属于底层,Swing属于将其包装了一下,是AWT的儿子,功能比爸爸更强。
一、窗口
JFrame 的GUI程序的基本思路是以JFrame为基础,它是屏幕上window的对象,能够最大化、最小化以及关闭。
public class JFrameDemo2 {
public static void main(String[] args) {
new MyJFrame2().init();
}
}
//这里没有采用构造方法,而是自己定义了一个初始化方法。
class MyJFrame2 extends JFrame {
//JFrame是一个*窗口
//初始化方法
public void init() {
//设置窗口的一系列参数
this.setBounds(100, 100, 400,200);
this.setBackground(Color.green);
this.setVisible(true);
//设置一个标签参数
JLabel jLabel = new JLabel("Hello!JFrame!");
//将标签添加进窗口中
add(jLabel);
//关闭窗口:和Frame的关闭方法不一样
//这里不需要重写方法,只需要调用方法,传参即可
//EXIT_ON_CLOSE、HIDE_ON_CLOSE最常用
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
}
运行结果:
你会发现窗口并没有变成指定的颜色!这时就需要添加一个容器,如下所示:
注意:这里还把标签居中了
public class JFrameDemo {
public static void main(String[] args) {
new MyJFrame().init();
}
}
class MyJFrame extends JFrame {
public void init() {
this.setBounds(100, 100, 400,200);
this.setVisible(true);
//获得一个真正的容器,使用JFrame类,必须使用容器来接受
Container container = this.getContentPane();
container.setBackground(Color.green);
JLabel jLabel = new JLabel("Hello!JFrame!");
//将标签水平居中
jLabel.setHorizontalAlignment(SwingConstants.CENTER);
add(jLabel);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
}
运行结果:
问题:为什么Frame可以直接设置窗口的各种属性,而JFrame需要通过一个容器?
在这个问题上,我当时只看了JFrame的源码,并没有找到原因,于是就自己联想,导致自己对此认识错误。在老师的引导下,自己懂得了遇到问题先百度。大家遇到问题也要学会先百度呦!
度娘的回答是:
1.在完成初始化,调用getContentPane()方法得到一个contentPane容器,然后将其设置为不可见,即setVisible(false)。这样,你就可以看到JFrame的庐山真面貌
2.在你使用JFrame创建窗体时的情况:
在你直接调用setBackground(Color.red)这个方法后,你的确设置了JFrame的背景颜色,而你看到的却不是直接的JFrame,而是JFrame.getContentPane()。而JFrame上的contentPane默认是Color.WHITE的,所以,无论你对JFrame怎么设置背景颜色,你看到的都只是contentPane(白色)。
setDefaultCloseOperation()参数的使用说明
System.exit(0)是退出整个程序,如果有多个窗口,全部都销毁退出。
setDefaultCloseOperation()是设置用户在此窗体上发起 "close" 时默认执行的操作。必须指定以下选项之一:
1.DO_NOTHING_ON_CLOSE(在 WindowConstants 中定义):不执行任何操作;要求程序在已注册的 WindowListener 对象的 windowClosing 方法中处理该操作。
2.HIDE_ON_CLOSE(在 WindowConstants 中定义):调用任意已注册的 WindowListener 对象后自动隐藏该窗体。
3.DISPOSE_ON_CLOSE(在 WindowConstants 中定义):调用任意已注册 WindowListener 的对象后自动隐藏并释放该窗体。
4.EXIT_ON_CLOSE(在 JFrame 中定义):使用 System.exit(0) 方法退出应用程序。仅在应用程序中使用。
5.默认情况下,该值被设置为 HIDE_ON_CLOSE
也就是说没有设置的话,默认点击关闭时只是隐藏窗体,在后台进程中还可以看到,如果有多个窗口,只是销毁调用dispose的窗口,其他窗口仍然存在,整个应用程序还是处于运行状态。
二、弹窗
JDialog,用来被弹出的窗口,默认就有关闭事件!
是一个带标题和边界的顶层窗口,边界一般用于从用户处获得某种形式的输入。
//主窗口
public class DialogDemo extends JFrame {
//构造器
public DialogDemo() {
this.setVisible(true);
this.setBounds(100, 100, 400, 200);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//容器
Container container = this.getContentPane();
//绝对布局
container.setLayout(null);
//按钮
JButton jButton = new JButton("按钮");
jButton.setBounds(30,30,300,100);
//添加按钮的监听事件,按下按钮后就会弹出一个弹窗
jButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new MyDialogDemo();
}
});
container.add(jButton);
}
public static void main(String[] args) {
new DialogDemo();
}
}
//弹窗
class MyDialogDemo extends JDialog {
public MyDialogDemo() {
this.setVisible(true);
this.setBounds(100,100,500,200);
Container container = this.getContentPane();
container.setLayout(null);
container.add(new Label("这是一个弹窗"));
}
}
三、标签
JLabel 对象可以显示文本、图像或同时显示二者。可以通过设置垂直和水平对齐方式,指定显示区中标签内容在何处对齐。默认情况下,标签在其显示区内是垂直居中对齐。默认情况下,只显示文本的标签是边对齐;而只显示图像的标签则水平居中对齐。
生成图标Icon
这里采用实现Icon接口的方式,这是需要重写三个方法;顾名思义,就可以知道这些方法的作用。
public class IconDemo extends JFrame implements Icon {
private int width;
private int height;
//无参构造
public IconDemo() {
}
//有参构造
public IconDemo(int width, Integer height) {
this.width = width;
this.height = height;
}
public void init() {
IconDemo iconDemo = new IconDemo(18, 18);
JLabel jLabel = new JLabel("图片标签", iconDemo, SwingConstants.CENTER);
Container container = this.getContentPane();
container.add(jLabel);
this.setVisible(true);
this.setBounds(100, 100, 400, 200);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
@Override
public void paintIcon(Component c, Graphics g, int x, int y) {
//画一个实心圆
g.fillOval(x, y, width, height);
}
@Override
public int getIconWidth() {
return this.width;
}
@Override
public int getIconHeight() {
return this.height;
}
public static void main(String[] args) {
new IconDemo().init();
}
}
生成图像Icon
public class ImageIconDemo extends JFrame {
//构造方法
public ImageIconDemo() {
//标签
JLabel jLabel = new JLabel("图像");
//获取图片
//获取图片时,要注意图片的路径,只有路径对了,才能找到,正确运行。
//一般我们都用这种方式来得到图片。
URL url = ImageIconDemo.class.getResource("picture.jpg");
//转换成ImageIcon
ImageIcon imageIcon = new ImageIcon(url);
//设置图像标签
jLabel.setIcon(imageIcon);
//水平居中
jLabel.setHorizontalAlignment(SwingConstants.CENTER);
//容器
Container container = getContentPane();
container.add(jLabel);
setBounds(100, 100, 400, 200);
setVisible(true);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new ImageIconDemo();
}
}
运行结果同上,只是实心圆变成了一张你指定的图像。
四、面板
JPanel:
图形用户界面(GUI)工具包swing中的面板容器类,包含在javax.swing 包中,可以进行嵌套,功能是对窗体中具有相同逻辑功能的组件进行组合,是一种轻量级容器,可以加入到 JFrame窗体中。
public class JPanelDemo extends JFrame {
//构造方法
public JPanelDemo() {
Container container = this.getContentPane();
//设置容器的布局格式
container.setLayout(new GridLayout(2, 1, 10, 10));
//GridLayout(2, 1, 10, 10)后面的两个参数,表示间距,看了运行结果,你就理解了
JPanel jPanel1 = new JPanel(new GridLayout(1, 3));
JPanel jPanel2 = new JPanel(new GridLayout(1, 2));
JPanel jPanel3 = new JPanel(new GridLayout(2, 1));
JPanel jPanel4 = new JPanel(new GridLayout(3, 2));
jPanel1.add(new JButton("1"));
jPanel1.add(new JButton("1"));
jPanel1.add(new JButton("1"));
jPanel2.add(new JButton("2"));
jPanel2.add(new JButton("2"));
jPanel3.add(new JButton("3"));
jPanel3.add(new JButton("3"));
jPanel4.add(new JButton("4"));
jPanel4.add(new JButton("4"));
jPanel4.add(new JButton("4"));
jPanel4.add(new JButton("4"));
jPanel4.add(new JButton("4"));
jPanel4.add(new JButton("4"));
container.add(jPanel1);
container.add(jPanel2);
container.add(jPanel3);
container.add(jPanel4);
this.setBounds(100, 100, 400, 200);
this.setVisible(true);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new JPanelDemo();
}
}
JScrollPanel
实现用于单个子组件的自动水平或垂直滚动的容器类。
//文本域
//TextArea类
//setText()方法
public class JScrollDemo extends JFrame {
public JScrollDemo() {
//容器
Container container = this.getContentPane();
//文本域
TextArea textArea = new TextArea(20,50);
//设置文本内容
textArea.setText("学习JScroll面板");
//通过文本域内容生成一个JScroll面板
JScrollPane jScrollPane = new JScrollPane(textArea);
//添加进容器中
container.add(jScrollPane);
this.setBounds(100, 100, 400, 200);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
this.setVisible(true);
}
public static void main(String[] args) {
new JScrollDemo();
}
}
五、按钮
用于创建按钮。
图片按钮
//ImageIcon类
//setIcon()方法、setToolTipText()方法
public class JButtonDemo extends JFrame {
public JButtonDemo() {
//容器
Container container = this.getContentPane();
//将图片变成一个图标
URL url = JButtonDemo.class.getResource("tx.jpg");
ImageIcon imageIcon = new ImageIcon(url);
JButton jButton = new JButton();
jButton.setIcon(imageIcon);
//
jButton.setToolTipText("图片按钮");
container.add(jButton);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
this.setBounds(100, 100,400, 200);
this.setVisible(true);
}
public static void main(String[] args) {
new JButtonDemo();
}
}
单选按钮
//JRadioButton类
//ButtonGroup类
public class JButtonDemo2 extends JFrame {
public JButtonDemo2() {
Container container = this.getContentPane();
container.setLayout(new GridLayout(1, 3));
//单选框
JRadioButton jRadioButton1 = new JRadioButton("JRadioButton1");
JRadioButton jRadioButton2 = new JRadioButton("JRadioButton2");
JRadioButton jRadioButton3 = new JRadioButton("JRadioButton3");
//由于单选框只能选择一个,所以将其分组,默认一个组中只能选择一个
ButtonGroup group = new ButtonGroup();
group.add(jRadioButton1);
group.add(jRadioButton2);
group.add(jRadioButton3);
container.add(jRadioButton1, BorderLayout.WEST);
container.add(jRadioButton2, BorderLayout.CENTER);
container.add(jRadioButton3, BorderLayout.EAST);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
this.setBounds(100, 100,400, 200);
this.setVisible(true);
}
public static void main(String[] args) {
new JButtonDemo2();
}
}
复选按钮
//JCheckBox类
public class JButtonDemo3 extends JFrame {
public JButtonDemo3() {
Container container = this.getContentPane();
//多选框
JCheckBox jCheckBox1 = new JCheckBox("JCheckBox1");
JCheckBox jCheckBox2 = new JCheckBox("JCheckBox2");
container.add(jCheckBox1, BorderLayout.NORTH);
container.add(jCheckBox2, BorderLayout.SOUTH);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
this.setBounds(100, 100,400, 200);
this.setVisible(true);
}
public static void main(String[] args) {
new JButtonDemo3();
}
}
六、列表
下拉框
//JCombobox类
//addItem()方法
public class ComboboxDemo1 extends JFrame {
public ComboboxDemo1() {
Container container = this.getContentPane();
//这里会出现泛型,可以删掉不写
JComboBox jComboBox = new JComboBox();
//这里null是想让下拉框的内容一开始什么没有
//选择了才有内容
jComboBox.addItem(null);
jComboBox.addItem("1");
jComboBox.addItem("2");
jComboBox.addItem("3");
container.add(jComboBox);
this.setBounds(100, 100, 400, 200);
this.setVisible(true);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new ComboboxDemo1();
}
}
列表
List 组件为用户提供了一个可滚动的文本项列表。
//JList类
//Vector类
public class ComboboxDemo2 extends JFrame {
public ComboboxDemo2() {
Container container = this.getContentPane();
Vector vector = new Vector();
//给列表添加进你要放入的内容,可以设置动态添加
JList jList = new JList(vector);
vector.add("1");
vector.add("2");
vector.add("3");
container.add(jList);
this.setBounds(100, 100, 400, 200);
this.setVisible(true);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new ComboboxDemo2();
}
}
七、文本框
文本框
JTextField :一个轻量级组件,它允许编辑单行文本。
//JTextField类
public class TextDemo1 extends JFrame {
public TextDemo1() {
Container container = this.getContentPane();
JTextField jTextField1 = new JTextField("哈哈!", 10);
JTextField jTextField2 = new JTextField("你好!", 10);
container.add(jTextField1, BorderLayout.NORTH);
container.add(jTextField2, BorderLayout.SOUTH);
this.setBounds(100, 100, 400, 200);
this.setVisible(true);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new TextDemo1();
}
}
密码框
JPasswordField – 允许我们输入了一行字像输入框,用星号() 或其它字符隐藏,创建密码。
//JPasswordField
//setEchoChar()方法
public class TextDemo2 extends JFrame {
public TextDemo2() {
Container container = this.getContentPane();
JPasswordField passwordField = new JPasswordField();
//注意:这里传递的参数是字符型的!
passwordField.setEchoChar('*');
container.add(passwordField);
this.setBounds(100, 100, 400, 200);
this.setVisible(true);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new TextDemo2();
}
}
文本域
JTextArea 对象是显示文本的多行区域。
//TextArea类
//setText()方法
public class JScrollDemo extends JFrame {
public JScrollDemo() {
//容器
Container container = this.getContentPane();
//文本域
JTextArea jtextArea = new JTextArea(20,50);
//设置文本内容
jtextArea.setText("学习JScroll面板");
//通过文本域内容生成一个JScroll面板
JScrollPane jScrollPane = new JScrollPane(jtextArea);
//添加进容器中
container.add(jScrollPane);
this.setBounds(100, 100, 400, 200);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
this.setVisible(true);
}
public static void main(String[] args) {
new JScrollDemo();
}
}
上一篇: vue响应式原理的实现