Java GUI-Swing详解

文章目录

    • 一、GUI-Swing
      • 1. Swing介绍
      • 2. 窗口
      • 3. 弹窗
      • 4. 标签
        • 1)图标标签
        • 2)图片标签
      • 5. 面板
        • 1)普通面板
        • 2)带有滚动条的面板
      • 6. 按钮
        • 1)图片按钮
        • 2)单选按钮
        • 3)复选按钮
      • 7. 列表
        • 1)下拉框
        • 2)列表框
      • 8. 文本框
        • 1)文本框
        • 2)密码框
        • 3)文本域

一、GUI-Swing

1. Swing介绍

  • 什么是Swing
    • 也是Java图形用户界面的处理方法,不过Swing是高级图形库,是基于Awt平台为基础构建起来的组件
  • Swing特点
    • 是轻量级的,没有使用Windows函数
    • 移植性好,因为没有使用Windows平台的函数,而是使用虚拟机进行调用,所以可以在任意的平台运行,没有平台限制
    • 运行较慢,在Windows平台运行下还是Awt更快

2. 窗口

  • JFrame

  • 作用

    • Swing中的顶级窗口,也是容器,用来存放其他的容器与组件
  • 注意事项

    • 在JFrame窗口中,并不是直接在窗口上进行操作的,而是隔了一个默认的ContentPane容器,优先展示的是ContentPane的属性设置。所以有时候会发生对JFrame窗口进行设置后,看不到设置的结果,就是因为优先展示的是ContentPane的设置。
    • 使用getContentPane()方法得到这个窗口容器
    • 建议除了窗口的关闭按钮、大小、位置、可见性等,其他颜色、布局、添加组件等操作都在窗口容器中进行操作
  • 代码示例

    • 创建一个JFrame窗口,并在窗口的中间添加一个标签
    public class WindowJFrame {//Swing中Jframe窗口练习public static void main(String[] args) {new WindowJFrame("Swing中JFrame窗口练习");}public WindowJFrame(String total) {JFrame frame = new JFrame(total);//创建JFrame窗口//设置窗口的位置大小属性frame.setBounds(100, 100, 500, 500);//获得窗口的容器Container container = frame.getContentPane();//使用窗口容器设置窗口的布局为绝对布局container.setLayout(null);//设置标签Label label = new Label("这是JFrame窗口的标签");label.setBackground(Color.yellow);label.setBounds(200, 200, 150, 50);//将标签添加进窗口容器中container.add(label);//设置可见性及窗口的关闭按钮frame.setVisible(true);frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);}
    }

3. 弹窗

  • JDialog

  • 作用

    • 创建一个对话框窗口(弹窗)
    • 这个弹窗默认实现了关闭按钮的功能,不用再手动实现
  • 代码练习

    • 创建一个窗口,窗口中间添加一个JButton按钮,当点击这个按钮时,就弹出一个弹窗
    public class JDialogTest extends JFrame {//Swing弹窗练习public static void main(String[] args) {new JDialogTest("Swing中弹窗JDialog的练习");}public JDialogTest(String total) {//设置窗口super(total);this.setBounds(100, 100, 500, 500);this.setVisible(true);this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);this.setResizable(false);//设置窗口是否可拉伸//得到窗口的容器,用来设置布局,放置组件Container container = this.getContentPane();//设置窗口容器的布局container.setLayout(null);//设置为绝对布局//创建一个JButton按钮JButton button = new JButton("点击我,你就可以获得一个弹窗");button.setBounds(150, 200, 250, 50);button.setBackground(Color.yellow);//设置JButton按钮的触发事件,弹出一个弹窗button.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {new MyJDialog("这是我的弹窗");//创建弹窗}});//将JButton按钮放进容器中container.add(button);}
    }class MyJDialog extends JDialog {public MyJDialog(String total) {//设置弹窗this.setBounds(500, 50, 400, 400);this.setVisible(true);/*不需要因为弹窗自实现窗口关闭功能*/this.setTitle("你想要的小弹窗");this.setResizable(false);//获得弹窗的容器Container container = this.getContentPane();container.setLayout(null);//创建标签JLabel label = new JLabel("我的弹窗标签");label.setBounds(150, 100, 100, 50);label.setBackground(Color.cyan);//将JLabel标签放进弹窗中container.add(label);}
    }

4. 标签

1)图标标签

  • 作用

    • 绘制一个图标,放在标签或按钮上面
  • 代码练习

    • 创建一个窗口,在窗口的中间添加一个JLabel标签,在标签上绘制一个矩形
    public class IconTest extends JFrame implements Icon {//Swing图标练习private int width;private int height;public static void main(String[] args) {new IconTest().init();}/*** 初始化方法*/private void init() {IconTest frame = new IconTest(50, 30);this.setBounds(100, 100, 500, 500);this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);this.setResizable(false);this.setVisible(true);JLabel label = new JLabel("图标", frame, SwingConstants.CENTER);//得到窗口的容器Container container = this.getContentPane();//将标签添加进窗口容器中container.add(label);}public IconTest() {}public IconTest(int width, int height) {this.width = width;this.height = height;}@Overridepublic void paintIcon(Component c, Graphics g, int x, int y) {g.setColor(Color.YELLOW);g.fillRect(x, y, 50, 30);}@Overridepublic int getIconWidth() {return this.width;}@Overridepublic int getIconHeight() {return this.height;}
    }

2)图片标签

  • ImageIcon

  • 作用

    • 将一个图片放标签或按钮上面
  • 代码练习

    • 将一个图片放在标签上
    public class ImageTest {//将一个图片设为标签的图案public static void main(String[] args) {new MyJFrame("将图片设置为标签的图案练习");}
    }class MyJFrame extends JFrame {public MyJFrame() {super();}public MyJFrame(String title) {super(title);this.setBounds(100, 100, 500, 500);this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//得到图片的资源URL url = MyJFrame.class.getResource("littleRobot.jpg");//括号内是图片的路径//将图片转为图标ImageIcon imageIcon = new ImageIcon(url);JLabel label = new JLabel("我的标签");label.setSize(26, 23);label.setLocation(150, 150);//将图标与标签关联label.setIcon(imageIcon);label.setHorizontalAlignment(SwingConstants.CENTER);//创建窗口容器,并将标签添加进去Container container = this.getContentPane();container.add(label);this.setVisible(true);//最有再将窗口设置为可见}
    }

5. 面板

1)普通面板

  • JPanel

  • 作用

    • 是一个轻量级的容器
  • 代码练习

    • 创建一个窗口,练习按钮的表格
    public class JPanelTest {//JPanel面板练习public static void main(String[] args) {new MyJPanelFrame("JPanel面板练习");}
    }/*** 自定义的窗口类*/
    class MyJPanelFrame extends JFrame {public MyJPanelFrame(String tital) {super(tital);this.setBounds(100, 100, 500, 500);this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//得到窗口的容器,并将窗口布局为两行两列的表格Container container = this.getContentPane();container.setLayout(new GridLayout(2, 2, 10, 10));//后面的两个10分别表示上下与左右间距//创建四个面板JPanel panel1 = new JPanel(new GridLayout(2, 1));JPanel panel2 = new JPanel(new GridLayout(1, 2));JPanel panel3 = new JPanel(new GridLayout(2, 2));JPanel panel4 = new JPanel(new GridLayout(2, 3));//往面板中添加JButton按钮panel1.add(new JButton("1"));panel1.add(new JButton("1"));panel2.add(new JButton("2"));panel2.add(new JButton("2"));panel3.add(new JButton("3"));panel3.add(new JButton("3"));panel3.add(new JButton("3"));panel3.add(new JButton("3"));panel4.add(new JButton("4"));panel4.add(new JButton("4"));panel4.add(new JButton("4"));panel4.add(new JButton("4"));panel4.add(new JButton("4"));panel4.add(new JButton("4"));//将四个面板装进窗口容器中container.add(panel1);container.add(panel2);container.add(panel3);container.add(panel4);//将窗口设置为可见的this.setVisible(true);}
    }

2)带有滚动条的面板

  • JScrollPanel

  • 作用

    • 一个带有滚动条的面板
  • 代码练习

    • 创建一个带有滚动条的文本窗口
    public class JScrollPanelTest extends JFrame {//滚动面板及文本域练习public static void main(String[] args) {new JScrollPanelTest("滚动面板及文本域的练习");}public JScrollPanelTest(String title) {super(title);this.setBounds(100, 100, 500, 500);//创建文本域,并设置文本域JTextArea textArea = new JTextArea("文本域");//内容textArea.setBounds(200, 200, 200, 300);//大小和位置textArea.setBackground(new Color(222, 230, 225));//颜色//创建滚动面板JScrollPane scrollPane = new JScrollPane(textArea);//创建窗口的容器,将滚动面板添加进窗口容器中Container container = this.getContentPane();container.add(scrollPane);//设置窗口的关闭及显示等this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//关闭this.setVisible(true);//可见性this.setResizable(false);//是否可拉伸}
    }

6. 按钮

1)图片按钮

  • ImageIcon

  • 作用

    • 将一个图片作为按钮的图标
  • 代码示例

    • 将一个图片设置为JButton按钮的图标
    public class PictureJButtons extends JFrame {//图片按钮练习public static void main(String[] args) {new PictureJButtons("图片按钮练习");}public PictureJButtons(String title) {//创建窗口super(title);this.setBounds(100, 100, 500, 500);//获得窗口的容器Container container = this.getContentPane();container.setLayout(null);//设置窗口布局为绝对布局//获得图片图标URL url = PictureJButtons.class.getResource("wechatIcon.png");ImageIcon imageIcon = new ImageIcon(url);//创建JButton按钮,并与图片图标相关联JButton button = new JButton();button.setIcon(imageIcon);button.setBounds(230, 230, 38, 38);//将JButton按钮放进窗口容器中container.add(button);//设置窗口的关闭及可见性this.setResizable(false);this.setVisible(true);this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);}
    }

2)单选按钮

  • JRadioButton

  • 作用

    • 单选按钮,同一组(ButtonGroup)中只能有一个按钮被选中
  • 代码练习

    • 实现三个单选按钮,让用户选择左中右
    public class SingleButtons extends JFrame {//单选按钮的练习public static void main(String[] args) {new SingleButtons("单选按钮的练习");}public SingleButtons(String title) {super(title);this.setBounds(100, 100, 500, 500);Container container = this.getContentPane();container.setLayout(null);//创建单选按钮JRadioButton leftButton = new JRadioButton("LEFT");leftButton.setBounds(120, 230, 80, 40);JRadioButton rightButton = new JRadioButton("CENTER");rightButton.setBounds(230, 230, 80, 40);JRadioButton centerButton = new JRadioButton("RIGHT");centerButton.setBounds(340, 230, 80, 40);//创建单选框的分组,一组之中同时只能选择一个按钮ButtonGroup group = new ButtonGroup();//将按钮放置进分组中group.add(leftButton);group.add(rightButton);group.add(centerButton);//将分组放进窗口容器中container.add(leftButton);container.add(rightButton);container.add(centerButton);//窗口关闭等设置this.setResizable(false);this.setVisible(true);this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);}
    }

3)复选按钮

  • JCheckBox

  • 作用

    • 可以选择复选框中的多个选项
  • 代码练习

    • 实现复选按钮,可以选择多个
     */
    public class CheckButtons extends JFrame {//复选按钮的练习public static void main(String[] args) {new CheckButtons("复选按钮的练习");}public CheckButtons(String title) {super(title);this.setBounds(100, 100, 500, 500);Container container = this.getContentPane();container.setLayout(null);//采用绝对布局//创建复选按钮JCheckBox checkBox1 = new JCheckBox("选项1");checkBox1.setBounds(150, 230, 80, 40);JCheckBox checkBox2 = new JCheckBox("选项2");checkBox2.setBounds(280, 230, 80, 40);//将复选按钮放进窗口容器中container.add(checkBox1);container.add(checkBox2);//窗口关闭等设置this.setResizable(false);this.setVisible(true);this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);}
    }

7. 列表

1)下拉框

  • JComboBox

  • 作用

    • 多个指定的选值,用户可以从多个指定的选值之中选择一个
    • 选择地域、年龄段、性别等有固定内容的、不希望用户随意输入的选项时用到
  • 代码练习

    • 让用户选择自己的年龄段
    public class DropDownBoxs extends JFrame {//下拉框的练习public static void main(String[] args) {new DropDownBoxs("下拉框的练习");}public DropDownBoxs(String title) {super(title);this.setBounds(100, 100, 500, 500);Container container = this.getContentPane();container.setLayout(null);//创建下拉框及设置JComboBox<String> comboBox = new JComboBox<>();comboBox.setBounds(100, 200, 300, 30);comboBox.setBackground(Color.cyan);//给下拉框中添加文字comboBox.addItem("0--20岁");comboBox.addItem("20--30岁");comboBox.addItem("30--50岁");comboBox.addItem("50--70岁");comboBox.addItem("70--100岁");//将下拉框添加进窗口容器中container.add(comboBox);//窗口关闭等设置this.setResizable(false);this.setVisible(true);this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);}
    }

2)列表框

  • JList

  • 作用

    • 显示对象列表,可以与集合相关联,动态的展示集合中的信息
  • 代码练习

    • 使用列表框将集合中的元素显示出来
    public class ListBoxs extends JFrame {//列表框的练习public static void main(String[] args) {new ListBoxs("列表框的练习");}public ListBoxs(String title) {super(title);this.setBounds(100, 100, 500, 500);Container container = this.getContentPane();container.setLayout(null);//创建列表框,并与集合相关联Vector<String> vector = new Vector<>();//创建集合JList<String> list = new JList<>(vector);//创建列表,与集合相关联,列表中展示集合中的元素list.setBounds(100, 100, 300, 300);//给集合中添加元素vector.add("ZhangSan------23");vector.add("LiSi------24");vector.add("WangWu------25");vector.add("ZhaoLiu------26");//将列表框添加进窗口容器container.add(list);//窗口关闭等设置this.setResizable(false);this.setVisible(true);this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);}
    }

8. 文本框

1)文本框

  • JTextField

  • 作用

    • 只能接收用户单行输入,遇到回车会自动触发事件
  • 代码练习

    • 创建一个文本框,可以接收用户输入的信息
    public class JTextFields extends JFrame {//文本框的练习,文本框一次只能输入一行public static void main(String[] args) {new JTextFields("文本框的练习");}public JTextFields(String title) {super(title);this.setBounds(100, 100, 500, 500);Container container = this.getContentPane();container.setLayout(null);//创建文本框JTextField textField = new JTextField();textField.setBounds(100, 100, 300, 30);//将文本框与窗口容器关联container.add(textField);//窗口关闭等设置this.setResizable(false);this.setVisible(true);this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);}
    }

2)密码框

  • JPasswordField

  • 作用

    • 密码框,用户看不到输入的内容,但是后台可以接收到实际的内容
  • 代码练习

    • 创建一个密码框
    public class PasswordBoxs extends JFrame {//密码框的练习public static void main(String[] args) {new PasswordBoxs("密码框的练习");}public PasswordBoxs(String title) {super(title);this.setBounds(100, 100, 500, 500);Container container = this.getContentPane();container.setLayout(null);//创建密码框JPasswordField passwordBox = new JPasswordField("我是密码框");passwordBox.setBounds(100, 100, 300, 30);//将用户输入的字符样式更改为指定的字符//passwordBox.setEchoChar('*');//将密码框添加进窗口容器中container.add(passwordBox);//窗口关闭等设置this.setResizable(false);this.setVisible(true);this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);}
    }

3)文本域

  • JTextArea

  • 作用

    • 一个支持多行输入的文本域,带有滚动条
  • 代码练习

    • 创建一个文本域
    public class TextAreas extends JFrame {//文本域的练习public static void main(String[] args) {new TextAreas("文本域的练习");}public TextAreas(String title) {super(title);this.setBounds(100, 100, 500, 500);Container container = this.getContentPane();container.setLayout(null);//创建文本域TextArea textArea = new TextArea("文本域");textArea.setBounds(100, 100, 300, 300);//将文本域添加进窗口容器中container.add(textArea);//窗口关闭等设置this.setResizable(false);this.setVisible(true);this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);}
    }