Java入门(12)-- Swing程序设计

2022-04-07 15:37:55 浏览数 (1)

12.1 Swing概述

GUI(图形用户界面)为程序提供图形界面,它最初的设计目的是为程序员构建一个通用的GUI,使其能够在所有的平台上运行,但Java1.0中基础类AWT(抽象窗口工具箱)并没有达到这个要求,于是Swing出现了,它是AWT组件的增强组件,但是它并不能完全替代AWT组件,这两种组件需要同时出现在一个图形用户界面中。

12.1.1 Swing特点

轻量级组件;

可插入外观组件。

12.1.2 Swing包

Swing组件的类的层次和继承关系:

12.1.3 常用Swing组件概述

12.2 常用窗体

12.2.1 JFrame窗体

JFrame窗体是一个容器,它是Swing程序中各个组件的载体,可以将JFrame看作是承载这些Swing组件的容器。可以通过继承java.swing.JFrame类创建一个窗体,在这个窗体中添加组件,同时为组件设置事件。

语法:

JFrame jf = new JFrame(title);

Container container = jf.getContentPane();

将组件添加至容器:

container.add(new JButton(“按钮”));

从容器中删除组件:

container.remove(new JButton(“按钮”));

代码语言:javascript复制
package swing;
import java.awt.*;
import javax.swing.*;
public class Example1 extends JFrame{
  private static final long serialVersionUID = 1L;
  public Example1(String title){
    super(title);
    setVisible(true);//使窗体可视
    setSize(400, 300);//设置窗体大小
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//设置窗体关闭方式
    Container container = getContentPane();
    JLabel jl = new JLabel("这是一个JFrame窗体");
    jl.setHorizontalAlignment(SwingConstants.CENTER);//使标签上的文字居中
    container.add(jl);
    container.setBackground(Color.pink);//设置容器的背景颜色
  }
  public static void main(String[] args) {
    new Example1("创建一个JFrame窗体");
  }
}

运行效果:

JFrame类的常用构造方法有两种:

public JFrame()

public JFrame(String title)

Java窗体常用关闭方式有4中:

DO_NOTHING_ON_CLOSE:什么都不做就将窗体关闭;

DISPOSE_ON_CLOSE:任何注册监听程序对象后会自动隐藏并释放窗体;

HIDE_ON_CLOSE:隐藏窗口的默认窗口关闭;

EXIT_ON_CLOSE:退出应用程序默认窗口关闭。

12.2.2 JDialog窗体

JDialog窗体是Swing组件中的对话框,它继承了AWT组件中的java.awt.Dialog类。JDialog窗体的功能是从一个窗体中弹出另一个窗体,就像是在使用IE浏览器时弹出的确定对话框一样。

通常使用以下几个JDialog类的构造方法:

public JDialog():创建一个没有标题和父窗体的对话框;

public JDialog(Frame f):创建一个指定父窗体的对话框,但该窗体没有标题;

public JDialog(Frame f, boolean model):创建一个指定类型的对话框,并指定父窗体,但该窗体没有指定标题;

public JDialog(Frame f, String title):创建一个指定标题和父窗体的对话框;

public JDialog(Frame f, String title, boolean model):创建一个指定标题、窗体和模式的对话框。

代码语言:javascript复制
package swing;
import java.awt.*;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Example2 extends JFrame{
  private static final long serialVersionUID = 1L;
  public Example2() {
    setLayout(null);//使该窗体取消布局管理器设置
    setVisible(true);//使窗体可视
    setSize(400, 300);//设置窗体大小
    Container container = getContentPane();
    JButton bl = new JButton("弹出对话框");
    bl.setBounds(10, 10, 100, 21);
    bl.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        new MyJDialog(Example2.this).setVisible(true);  
      }
    });
    container.add(bl);  
  }
  public static void main(String[] args) {
    new Example2();
  }
}
class MyJDialog extends JDialog{
  private static final long serialVersionUID = 1L;
  public MyJDialog(Example2 frame) {
    super(frame, "第一个JDialog窗体",true);
    Container container = getContentPane();//获得一个容器
    container.add(new JLabel("这是一个对话框"));
    setBounds(120, 120, 100, 100);//设置对话框窗体大小
  }
}

运行结果:

12.3 标签组件与图标

12.3.1 标签的使用

标签由JLabel类定义,它的父类为JComponent类。标签可以显示一行只读文本、一个图像或带图像的文本,它并不能产生任何类型的事件,只是简单地显示文本和图片,可以指定标签上文本的对齐方式。

JLabel类常用的几种构造方法:

public JLabel():创建一个不带图片和文本的JLabel对象;

public JLabel(Icon icon):创建一个带图标的JLabel对象

public JLabel(Icon icon, int aligment):创建一个带图标的JLabel对象,并设置图标水平对齐方式;

public JLabel(String text, int aligment):创建一个带文本的JLabel对象,并设置文本水平对齐方式;

public JLabel(String text, Icon icon, int aligment):创建一个带文本、带图标的JLabel对象,并设置标签内容的水平对齐方式。

12.3.2 图标的使用

Swing中的图标可以放置在按钮、标签等组件上,用于描述组件的用途。图标可以用Java支持的图片文件类型进行创建,也可以使用java.awt.Graphics类提供的功能方法来创建。

1. 创建图标

在Swing中通过Icon接口来创建图标,可以在创建时给定图标的大小、颜色等特性。如果使用Icon接口,必须实现Icon接口中的3个方法:

public int getIconHeight():获取图标的高

public int getIconWidth():获取图标的长

public void paintIcon(Component arg0, Graphics arg1, int arg2, int arg3):在指定坐标位置画图

代码语言:javascript复制
package swing;
import java.awt.*;
import javax.swing.*;
public class DrawIcon implements Icon{
  private int width;
  private int height;
  public DrawIcon(int width, int height) {
    this.width = width;
    this.height = height;
  }
  @Override
  public int getIconWidth() {
    return this.height;
  }
  @Override
  public int getIconHeight() {
    return this.width;
  }
  @Override
  public void paintIcon(Component c, Graphics g, int x, int y) {
    g.fillOval(x, y, width, height);//绘制一个圆形
  }
  public static void main(String[] args) {
    JFrame jf = new JFrame();
    Container container = jf.getContentPane();
    jf.setVisible(true);//使窗体可视
    jf.setSize(400, 300);//设置窗体大小
    DrawIcon icon = new DrawIcon(20, 20);
    JLabel jl = new JLabel("测试", icon, SwingConstants.CENTER);
    container.add(jl);
  }
}

运行结果:

2. 使用图片图标

Swing中的图标除了可以绘制之外,还可以使用某个特定的图片创建。Swing利用javax.swing.ImageIcon类根据现有图片创建图标,ImageIcon类实现了Icon接口,同时Java支持多种图片格式。

ImageIcon类常用的构造方法:

public ImageIcon():创建一个通用的ImageIcon对象,当真正需要设置图片时再使用ImageIcon对象调用setImage(Image image)方法来操作;

public ImageIcon(Image image):可以直接从图片源创建图标;

public ImageIcon(Image image, String description):从图片源创建图标的同时为图标添加简短的描述,这个描述不会在图标上显示,可以使用getDescription()方法获取;

public ImageIcon(URL url):利用位于计算机网络上的图像文件创建图标

代码语言:javascript复制
package swing;
import java.awt.*;
import javax.swing.*;
public class MyImageIcon extends JFrame{
  private static final long serialVersionUID = 1L;
  public MyImageIcon() {
    Container container = getContentPane();
    JLabel jl = new JLabel();
    java.net.URL url = MyImageIcon.class.getResource("milaoshu.jpg");//获取图片所在的URl
    Icon icon = new ImageIcon(url);
    jl.setIcon(icon);//为标签设置图片
    jl.setOpaque(true);//设置标签为不透明状态
    container.add(jl);
  }
  public static void main(String[] args) {
    JFrame jf = new MyImageIcon();
    jf.setVisible(true);//使窗体可视
    jf.setSize(500, 600);//设置窗体大小
    jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//设置窗体关闭方式
  }
}

运行结果:

12.4 常用布局管理器

12.4.1 绝对布局

绝对布局,就是硬性指定组件在容器中的位置和大小,可以使用绝对坐标的方式来指定组件的位置。

使用绝对布局的步骤如下:

1)使用Container.setLayout(null)方法取消布局管理器;

2)使用Component.setBounds()方式设置每个组件的大小与位置。

代码语言:javascript复制
package swing;
import java.awt.*;
import javax.swing.*;
public class AbsolutePosition extends JFrame{
  private static final long serialVersionUID = 1L;
  public AbsolutePosition(){
    setTitle("本窗体使用绝对布局");//设置该窗体的标题
    setVisible(true);//使窗体可视
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//设置窗体关闭方式
    setLayout(null);//使该窗体取消布局管理器设置
    setBounds(100,100,400,300);//绝对定位窗体的位置与大小
    Container c = getContentPane();//创建容器对象
    JButton b1 = new JButton("按钮1");
    JButton b2 = new JButton("按钮2");
    b1.setBounds(10, 30,80, 30);
    b2.setBounds(60, 70, 100, 20);
    c.add(b1);
    c.add(b2);
  }
  public static void main(String[] args) {
    new AbsolutePosition();
  }
}

运行结果:

12.4.2 流布局管理器

流(FlowLayout)布局管理器,从左到右摆放组件,直到占据了这一行的所有空间,然后再向下移动一行。默认情况下,组件在每一行都是居中排列的,可以通过设置更改组件的排列位置。

FlowLayout类常用的构造方法:

public FlowLayout()

public FlowLayout(int alignment)

public FlowLayout(int alignment, int horizGap, int vertGap)

horizGap与vertGap两个参数分别以像素为单位指定组件之间的水平间隔与垂直间隔。

alignment参数表示使用流布局管理器后组件在每一行的具体摆放位置,可被赋值为:

FlowLayout.LEFT = 0

FlowLayout.CENTER = 1

FlowLayout.RIGHT = 2

代码语言:javascript复制
package swing;
import java.awt.*;
import javax.swing.*;
public class FlowLayoutPosition extends JFrame{
  private static final long serialVersionUID = 1L;
  public FlowLayoutPosition() {
    setTitle("本窗体使用流布局管理器");
    setLayout(new FlowLayout(2,10,10));
    Container c = getContentPane();
    for(int i = 0; i < 10; i  ){
      c.add(new JButton("button"   i));
    }
    setSize(320, 200);
    setVisible(true);
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
  }
  public static void main(String[] args) {
    new FlowLayoutPosition();
  }
}

运行结果:

12.4.3 边界布局管理器

边界布局管理器可以将容器划分为东、南、西、北、中5个区域,可以将组件加入到这5个区域中。

BorderLayout类的主要成员变量:

BorderLayout.NORTH:置于顶端;

BorderLayout.SOUTH:置于底端;

BorderLayout.EAST:置于右端;

BorderLayout.WEST:置于左端;

BorderLayout.CENTER:置于中间。

代码语言:javascript复制
package swing;
import java.awt.*;
import javax.swing.*;
public class BorderLayoutPosition extends JFrame{
  private static final long serialVersionUID = 1L;
  //定义组件摆放位置的数组
  String[] border = {BorderLayout.CENTER, BorderLayout.NORTH,BorderLayout.SOUTH,BorderLayout.WEST,BorderLayout.EAST};
  String[] buttonName = {"center button", "north button", "south button", "west button", "east button"};
  public BorderLayoutPosition() {
    setTitle("这个窗体使用边界布局管理器");
    setLayout(new BorderLayout());
    Container c = getContentPane();
    for(int i = 0; i < border.length; i  ) {
      c.add(border[i], new JButton(buttonName[i]));
    }
    setSize(350, 200);
    setVisible(true);
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
  }
  public static void main(String[] args) {
    new BorderLayoutPosition();
  }
}

运行结果:

12.4.4 网络布局管理器

网格(GridLayout)布局管理器将容器划分为网格,组件可以按行和列进行排列。在网格布局管理器中,每一个组件的大小都相同,网格中空格的个数由网格的行数和列数决定。

网格布局管理器常用的两个构造方法:

public GridLayout(int rows, int columns)

public GridLayout(int rows, int columns, int horizGap, int vertGap)

代码语言:javascript复制
package swing;
import java.awt.*;
import javax.swing.*;
public class GridLayoutPosition extends JFrame{
  private static final long serialVersionUID = 1L;
  public GridLayoutPosition() {
    setTitle("这是一个使用网格布局管理器的窗体");
    setLayout(new GridLayout(7,3,5,5));
    Container c = getContentPane();
    for(int i = 0; i < 20; i  ) {
      c.add(new JButton("button"   i));
    }
    setSize(300,300);
    setVisible(true);
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
  }
  public static void main(String[] args) {
    new GridLayoutPosition();
  }
}

运行结果:

12.4.5 网络组布局管理器

由GridBagLayout类实现的布局管理器称为网络组布局管理器,它实现了一个动态的矩形网格,这个矩形网格由无数个矩形单元格组成,每个组件可以占用一个或多个这样的单元格。

1. gridx和gridy属性

设置组件起始点所在单元格的索引值。gridx设置水平方向索引值,gridy设置垂直方向索引值。

2. gridwidth和gridheight属性

设置组件占用网格组的行数和列数。gridwidth占用网格组的列数;gridheight占用网格组的行数。

3. anchor属性

设置组件在其所在显示区域的显示位置。通常将显示区域从方向上划分为9个方位,分别为北方(NORTH)、东北(NORTHEAST)、东方(EAST)、东南(SOUTHEAST)、南方(SOUTH)、西南(SOUTHWEST)、西方(WEST)、西北(NORTHWEST)和中心(CENTER)。

4. fill属性

设置组件的填充方式。可以利用4个静态常量设置该属性:

NONE:默认值,不调整组件大小;

HORIZONTAL:只调整组件水平方向的大小;

VERTICAL:只调整组件垂直方向的大小;

BOTH:同时调整组件的宽度和高度至填满显示区域。

5. insets属性

设置组件四周与单元格边缘之间的最小距离。

Insets类仅有一个构造方法:

Insets(int top, int left, int bottom, int right)

6. ipadx和ipady属性

修改组件的首选大小。ipadx修改组件的宽度,ipady用来修改组件的高度。如果为正数,则在首选大小的基础上增加指定的宽度和高度;如果为负数,则在首选大小的基础上减小指定的宽度和高度。

7. weightx和weighty属性

设置网格组的每一行和每一列对额外空间的分布方式。默认值为0,表示不分布容器的额外空间。属性weightx用来设置其所在列对额外空间的分布方式;属性weighty用来设置其所在行对额外空间的分布方式。

注:在设置网格组的每一行和每一列对额外空间的分布方式时,建议只设置第一行的weightx属性和第一列的weighty属性,建议为各个属性按百分比取值。

代码语言:javascript复制
package swing;
import java.awt.*;
import javax.swing.*;
public class GridBagLayoutPosition extends JFrame{
  private static final long serialVersionUID = 1L;
  public GridBagLayoutPosition() {
    setTitle("使用网格组布局管理器");
    setLayout(new GridBagLayout());
    Container c = getContentPane();
    JButton button = new JButton("A");
    GridBagConstraints gridBagConstraints = new GridBagConstraints();
    gridBagConstraints.gridy = 0;
    gridBagConstraints.gridx = 0;
    gridBagConstraints.weightx = 10;
    gridBagConstraints.fill = GridBagConstraints.HORIZONTAL;
    c.add(button, gridBagConstraints);
    JButton button_1 = new JButton("B");
    GridBagConstraints gridBagConstraints_1 = new GridBagConstraints();
    gridBagConstraints_1.gridy = 0;
    gridBagConstraints_1.gridx = 1;
    gridBagConstraints_1.insets = new Insets(0,5,0,0);
    gridBagConstraints_1.weightx = 20;
    gridBagConstraints_1.fill = GridBagConstraints.HORIZONTAL;
    c.add(button_1, gridBagConstraints_1);
    JButton button_2 = new JButton("C");
    GridBagConstraints gridBagConstraints_2 = new GridBagConstraints();
    gridBagConstraints_2.gridy = 0;
    gridBagConstraints_2.gridx = 2;
    gridBagConstraints_2.gridheight = 2;
    gridBagConstraints_2.insets = new Insets(0,5,0,0);
    gridBagConstraints_2.weightx = 30;
    gridBagConstraints_2.fill = GridBagConstraints.BOTH;
    c.add(button_2, gridBagConstraints_2);
    JButton button_3 = new JButton("D");
    GridBagConstraints gridBagConstraints_3 = new GridBagConstraints();
    gridBagConstraints_3.gridy = 0;
    gridBagConstraints_3.gridx = 3;
    gridBagConstraints_3.gridheight = 4;
    gridBagConstraints_3.insets = new Insets(0,5,0,5);
    gridBagConstraints_3.weightx = 40;
    gridBagConstraints_3.fill = GridBagConstraints.BOTH;
    c.add(button_3, gridBagConstraints_3);
    JButton button_4 = new JButton("E");
    GridBagConstraints gridBagConstraints_4 = new GridBagConstraints();
    gridBagConstraints_4.gridy = 1;
    gridBagConstraints_4.gridx = 0;
    gridBagConstraints_4.gridwidth = 2;
    gridBagConstraints_4.insets = new Insets(5,0,0,0);
    gridBagConstraints_4.weightx = 40;
    gridBagConstraints_4.fill = GridBagConstraints.HORIZONTAL;
    c.add(button_4, gridBagConstraints_4);
    JButton button_5 = new JButton("F");
    GridBagConstraints gridBagConstraints_5 = new GridBagConstraints();
    gridBagConstraints_5.gridy = 2;
    gridBagConstraints_5.gridx = 0;
    gridBagConstraints_5.insets = new Insets(5,0,0,0);
    gridBagConstraints_5.fill = GridBagConstraints.HORIZONTAL;
    c.add(button_5, gridBagConstraints_5);
    JButton button_6 = new JButton("G");
    GridBagConstraints gridBagConstraints_6 = new GridBagConstraints();
    gridBagConstraints_6.gridy = 2;
    gridBagConstraints_6.gridx = 1;
    gridBagConstraints_6.gridwidth = 2;
    gridBagConstraints_6.gridheight = 2;
    gridBagConstraints_6.insets = new Insets(5,5,0,0);
    gridBagConstraints_6.fill = GridBagConstraints.BOTH;
    c.add(button_6, gridBagConstraints_6);
    JButton button_7 = new JButton("H");
    GridBagConstraints gridBagConstraints_7 = new GridBagConstraints();
    gridBagConstraints_7.gridy = 3;
    gridBagConstraints_7.gridx = 0;
    gridBagConstraints_7.insets = new Insets(5,0,0,0);
    gridBagConstraints_7.fill = GridBagConstraints.HORIZONTAL;
    c.add(button_7, gridBagConstraints_7);
    setSize(500,200);
    setVisible(true);
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
  }
  public static void main(String[] args) {
    new GridBagLayoutPosition();
  }
}

运行结果:

12.5 常用面板

12.5.1 JPanel面板

JPanel面板可以聚集一些组件来布局。

代码语言:javascript复制
package swing;
import java.awt.*;
import javax.swing.*;
public class JPanelTest extends JFrame{
  private static final long serialVersionUID = 1L;
  public JPanelTest() {
    setTitle("在这个窗体中使用了面板");
    Container c = getContentPane();
    c.setLayout(new GridLayout(2,1,10,10));
    JPanel p1 = new JPanel(new GridLayout(1,3,10,10));
    JPanel p2 = new JPanel(new GridLayout(1,2,10,10));
    JPanel p3 = new JPanel(new GridLayout(1,2,10,10));
    JPanel p4 = new JPanel(new GridLayout(2,1,10,10));
    p1.add(new JButton("1"));
    p1.add(new JButton("2"));
    p1.add(new JButton("3"));
    p2.add(new JButton("4"));
    p2.add(new JButton("5"));
    p3.add(new JButton("6"));
    p3.add(new JButton("7"));
    p4.add(new JButton("8"));
    p4.add(new JButton("9"));
    c.add(p1);
    c.add(p2);
    c.add(p3);
    c.add(p4);
    setSize(400,400);
    setVisible(true);
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
  }
  public static void main(String[] args) {
    new JPanelTest();
  }
}

运行结果:

12.5.2 JScrollPane面板

JScrollPane面板是带滚动条的面板,只能放置一个组件,不可以使用布局管理器。如果需要在JScrollPane面板中放置多个组件,需要将多个组件放置在JPanel面板上,然后将JPanel面板作为一个整体组件添加在JScrollPane组件上。

代码语言:javascript复制
package swing;
import java.awt.*;
import javax.swing.*;
public class JScrollPaneTest extends JFrame{
  private static final long serialVersionUID = 1L;
  public JScrollPaneTest() {
    Container c = getContentPane();
    JTextArea ta = new JTextArea(20,50);
    JScrollPane sp = new JScrollPane(ta);
    c.add(sp);
    setTitle("带滚动条的文字编辑器");
    setSize(320,200);
    setVisible(true);
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
  }
  public static void main(String[] args) {
    new JScrollPaneTest();
  }
}

运行结果:

12.6 按钮组件

12.6.1 提交按钮组件

提交按钮组件由JButton对象表示,常用的构造方法有:

public JButton()

public JButton(String text)

public JButton(Icon icon)

public JButton(String text, Icon icon)

代码语言:javascript复制
package swing;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class JButtonTest extends JFrame{
  private static final long serialVersionUID = 1L;
  public JButtonTest() {
    java.net.URL url = MyImageIcon.class.getResource("0.png");
    Icon icon = new ImageIcon(url);
    setLayout(new GridLayout(3, 2, 5, 5));
    Container c = getContentPane();
    for(int i = 0; i < 5; i  ) {
      JButton J = new JButton("button"   i, icon);
      c.add(J);
      if(i%2 == 0) {
        J.setEnabled(false);//设置按钮是否可用
      }
    }
    JButton jb = new JButton();
    jb.setMaximumSize(new Dimension(90, 30));//设置按钮与图片相同大小
    jb.setIcon(icon);
    jb.setHideActionText(true);
    jb.setToolTipText("图片按钮");//设置提示文字
    jb.setBorderPainted(false);//设置按钮边界是否显示
    jb.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        JOptionPane.showMessageDialog(null, "弹出对话框");
      }
    });
    c.add(jb);
    setTitle("创建带文字与图片的按钮");
    setSize(400,400);
    setVisible(true);
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
  }
  public static void main(String[] args) {
    new JButtonTest();
  }
}

运行结果:

12.6.2 单选按钮组件

单选按钮是Swing组件中JRadioButton类的对象,该类是JToggleButton的子类,而JToggleButton类又是AbstractButton类的子类,所以控制单选按钮的诸多方法都是AbstractButton类中的方法。

JRadioButton类常用的构造方法有:

public JRadioButton()

public JRadioButton(Icon icon)

public JRadioButton(Icon icon, boolean selected)

public JRadioButton(String text)

public JRadioButton(String text, Icon icon)

public JRadioButton(String text, Icon icon, boolean selected)

在Swing中存在一个ButtonGroup类,用于产生按钮组,如果希望将所有的单选按钮放置在按钮组中,需要实例化一个JRadioButton对象,并使用该对象调用add()方法添加单选按钮。

12.6.3 复选框组件

复选框用JCheckBox类的对象表示,继承于AbstractButton类。

JCheckBox常用的构造方法:

public JCheckBox()

public JCheckBox(Icon icon, boolean checked)

public JCheckBox(String text, boolean checked)

代码语言:javascript复制
package swing;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class CheckBoxTest extends JFrame{
  private static final long serialVersionUID = 1L;
  public CheckBoxTest() {
    Container c = getContentPane();
    c.setLayout(new BorderLayout());
    JPanel panel1 = new JPanel();
    JPanel panel2 = new JPanel();
    JTextArea jt = new JTextArea(6,12);
    JCheckBox jc1 = new JCheckBox("1");
    JCheckBox jc2 = new JCheckBox("2");
    JCheckBox jc3 = new JCheckBox("3");
    c.add(panel1, BorderLayout.NORTH);
    c.add(panel2, BorderLayout.SOUTH);
    panel1.add(jt);
    panel2.add(jc1);
    jc1.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        jt.append("复选框1被选中n");
      }
    });
    panel2.add(jc2);
    jc2.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        jt.append("复选框2被选中n");
      }
    });
    panel2.add(jc3);
    jc3.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        jt.append("复选框3被选中n");
      }
    });
    setTitle("复选框组件");
    setSize(400,300);
    setVisible(true);
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
  }
  public static void main(String[] args) {
    new CheckBoxTest();
  }
}

运行结果:

12.7 列表组件

12.7.1 下拉列表框组件

Swing中的下拉列表框使用JComboBox类对象表示,它是javax.swing.JComponent类的子类,常用的构造方法有:

public JComboBox()

public JComboBox(ComboBoxModel dataModel)

public JComboBox(Object[] arrayData)

public JComboBox(Vector vector)

一般将下拉列表框中的项目封装为ComboBoxModel,ComboBoxModel为接口,代表一般模型,可以自定义一个类实现该接口,然后在初始化JComboBox对象时向上转型为ComboBoxModel接口类型,必须实现两种方法:

public void setSelectedItem(Object item)

public Object getSelectedItem()

setSelectedItem()方法用于设置下拉列表框中的选中项,getSelectedItem()方法用于返回下拉列表框中的选中项。

自定义这个类除了实现该接口外,还可以继承AbstractListModel类,在该类中有两个操作下拉列表框的方法:

getSize():返回列表的长度

getElementAt(int index):返回指定索引处的值

代码语言:javascript复制
package swing;
import java.awt.*;
import javax.swing.*;
public class JComboBoxModelTest extends JFrame{
  private static final long serialVersionUID = 1L;
  JComboBox <String> jc = new JComboBox<>(new MyComboBox());
  JLabel jl = new JLabel("请选择证件:");
  public JComboBoxModelTest() {
    Container c = getContentPane();
    c.setLayout(new FlowLayout());
    c.add(jl);
    c.add(jc);
    setTitle("下拉列表框组件");
    setSize(400,300);
    setVisible(true);
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
  }
  public static void main(String[] args) {
    new JComboBoxModelTest();
  }
}
class MyComboBox extends AbstractListModel<String> implements ComboBoxModel<String>{
  private static final long serialVersionUID = 1L;
  String selecteditem = null;
  String[] test = {"身份证","军人证","学生证","工作证"};
  @Override
  public int getSize() {
    return test.length;
  }
  @Override
  public String getElementAt(int index) {
    return test[index];
  }
  @Override
  public void setSelectedItem(Object anItem) {  
    selecteditem = (String)anItem;
  }
  @Override
  public Object getSelectedItem() {
    return selecteditem;
  }
}

运行结果:

12.7.2列表框组件

Swing中使用JList类对象来表示列表框,常用的构造方法有:

public void JList()

public void JList(Object[] listData)

public void JList(Vector listData)

public void JList(ListModel dataModel)

代码语言:javascript复制
package swing;
import java.awt.*;
import javax.swing.*;
public class JListTest extends JFrame{
  private static final long serialVersionUID = 1L;
  public JListTest() {
    Container cp = getContentPane();
    JList<String> jl = new JList<>(new MyListModel());
    JScrollPane js = new JScrollPane(jl);
    cp.setLayout(null);
    js.setBounds(10, 10, 100, 100);
    cp.add(js);
    setTitle("列表框组件");
    setSize(400,300);
    setVisible(true);
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
  }
  public static void main(String[] args) {
    new JListTest();
  }
}
class MyListModel extends AbstractListModel<String>{
  private static final long serialVersionUID = 1L;
  private String[] contents = {"列表1","列表2","列表3","列表4","列表5","列表6"};
  @Override
  public int getSize() {
    return contents.length;
  }
  @Override
  public String getElementAt(int index) {
    if(index < contents.length) {
      return contents[index  ];
    }else {
      return null;
    }
  }
}

运行结果:

12.8 文本组件

12.8.1 文本框组件

在Swing中通过javax.swing.JTextField类对象创建,该类继承了javax.swing.text.JTextComponent类。

创建文本框常用的构造方法:

public JTextField()

public JTextField(String text)

public JTextField(int fieldwidth)

public JTextField(String text, int fieldwidth)

public JTextField(Document docModel, String text, int fieldWidth)

代码语言:javascript复制
package swing;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class JTextFieldTest extends JFrame{
  private static final long serialVersionUID = 1L;
  public JTextFieldTest() {
    Container cp = getContentPane();
    cp.setLayout(new BorderLayout());
    JTextField jt = new JTextField("aaa", 20);
    JButton jb = new JButton("清除");
    cp.add(jt,BorderLayout.NORTH);
    cp.add(jb, BorderLayout.SOUTH);
    jt.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        jt.setText("触发事件");
      }
    });
    jb.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        jt.setText("");
        jt.requestFocus();
      }
    });
    setTitle("文本框组件");
    setSize(300,200);
    setVisible(true);
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
  }
  public static void main(String[] args) {
    new JTextFieldTest();
  }
}

运行结果:

12.8.2 密码框组件

常用的构造方法:

public JPasswordField()

public JPasswordField(String text)

public JPasswordField(int fieldwidth)

public JPasswordField(String text, int fieldwidth)

public JPasswordField(Document docModel, String text, int fieldWidth)

12.8.3 文本域组件

JTextArea常用的构造方法:

public JTextArea()

public JTextArea(String text)

public JTextArea(int rows, int columns)

public JTextArea(Document doc)

public JTextArea(Document doc, String Text, int rows, int columns)

代码语言:javascript复制
package swing;
import java.awt.*;
import javax.swing.*;
public class JTextAreaTest extends JFrame{
  private static final long serialVersionUID = 1L;
  public JTextAreaTest() {
    setTitle("定义自动换行的文本域");
    setSize(300,200);
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    Container cp = getContentPane();
    JTextArea jt = new JTextArea("文本域",6,6);
    jt.setLineWrap(true);//可以自动换行
    cp.add(jt);
    setVisible(true);
  }
  public static void main(String[] args) {
    new JTextAreaTest();
  }
}

运行结果:

12.9 常用事件监听器

12.9.1 动作事件监听器

事件名称:ActionEvent

事件源:JButton、JList、JTextField等

监听接口:ActionListener

添加或删除相应类型监听器的方法:addActionListener()、removeActionListener()

代码语言:javascript复制
package swing;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class SimpleEvent extends JFrame{
  private static final long serialVersionUID = 1L;
  JButton jb = new JButton("我是按钮,单机我");
  public SimpleEvent() {
    setLayout(null);
    setSize(300,200);
    Container cp = getContentPane();
    cp.add(jb);
    jb.setBounds(10, 10, 100, 30);
    setVisible(true);
    jb.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        jb.setText("我被单击了");
      }
    });
  }
  public static void main(String[] args) {
    new SimpleEvent();
  }
}

运行结果:

12.9.2 焦点事件监听器

事件名称:FocusEvent

事件源:Component以及派生类

监听接口:FocusListener

添加或删除相应类型监听器的方法:addFocusListener()、removeFocusListener()

0 人点赞