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()