Java窗口化

Swing类库

Swing 组织结构如图所示:

从图 1 可以看出,Swing 组件除了 AbstmctButton 类之外都以 J 开头。Swing 容器组件直接继承 AWT 类库中的容器组件类,其他大部分组件都是继承 JComponet 组件。组件可以划分为容器组件和非容器组件,容器组件包括 JFmme 和 JDialog。其中 JComponent 定义了非容器类的轻量级组件(JBntton、JPanel、JMenu 等)。

Swing窗口容器和面板容器

JFrame窗口

下面使用JFrame类创建一个简单的窗口:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package com.org.test;

import javax.swing.*;
import java.awt.*;
import java.io.PrintStream;
import java.util.concurrent.TimeUnit;

public class Test09 extends JFrame {

public Test09(){
setTitle("Java GUI程序");
setSize(400,300); // 尺寸
// 当用户执行关闭操作时应该什么
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JLabel jLabel = new JLabel("这是一个JFrame类创建的窗口");
Container c= getContentPane();
c.add(jLabel);
setVisible(true); //显示出来
}

public static void main(String[] args) throws InterruptedException {
new Test09();
}
}

运行结果如图:

JPanel面板

JPanel 类的构造方法如下。

  • JPanel():使用默认的布局管理器创建新面板,默认的布局管理器为 FlowLayout。
  • JPanel(LayoutManagerLayout layout):创建指定布局管理器的 JPanel 对象。

JPanel 类的常用方法如表 所示。

方法名及返回值类型 说明
Component add(Component comp) 将指定的组件追加到此容器的尾部
void remove(Component comp) 从容器中移除指定的组件
void setFont(Font f) 设置容器的字体
void setLayout(LayoutManager mgr) 设置容器的布局管理器
void setBackground(Color c) 设置组件的背景色

编写一个使用 JPanel 组件的窗口程序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package com.org.test;

import javax.swing.*;
import java.awt.*;
import java.io.PrintStream;
import java.util.concurrent.TimeUnit;

public class Test09 extends JFrame {

public Test09(){
setTitle("Java GUI程序");
setBounds(300,100,400,200); //位置以及窗口大小
// 当用户执行关闭操作时应该什么
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JLabel jLabel = new JLabel("这是一个JFrame类创建的窗口");
JPanel jPanel = new JPanel();
jPanel.setBackground(Color.white); //背景颜色白色
Container c= getContentPane();
jPanel.add(jLabel);
add(jPanel);
setVisible(true); //显示出来
}

public static void main(String[] args) throws InterruptedException {
new Test09();
}
}

Swing布局管理

边框布局管理器

BorderLayout(边框布局管理器)是 Window、JFrame 和 JDialog 的默认布局管理器。边框布局管理器将窗口分为 5 个区域:North、South、East、West 和 Center。其中,North 表示北,将占据面板的上方;Soufe 表示南,将占据面板的下方;East表示东,将占据面板的右侧;West 表示西,将占据面板的左侧;中间区域 Center 是在东、南、西、北都填满后剩下的区域,如图所示。

提示:边框布局管理器并不要求所有区域都必须有组件,如果四周的区域(North、South、East 和 West 区域)没有组件,则由 Center 区域去补充。如果单个区域中添加的不只一个组件,那么后来添加的组件将覆盖原来的组件,所以,区域中只显示最后添加的一个组件。

BorderLayout 布局管理器的构造方法如下所示。

  • BorderLayout():创建一个 Border 布局,组件之间没有间隙。
  • BorderLayout(int hgap,int vgap):创建一个 Border 布局,其中 hgap 表示组件之间的横向间隔;vgap 表示组件之间的纵向间隔,单位是像素。

使用 BorderLayout 将窗口分割为 5 个区域,并在每个区域添加一个标签按钮。实现代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Test0901{
public static void main(String[] args) {
JFrame jf = new JFrame();
jf.setSize(400,200);
jf.setLayout(new BorderLayout()); // 为Frame窗口色值布局为BorderLayout
// 按钮
JButton button1 = new JButton("上");
JButton button2 = new JButton("左");
JButton button3 = new JButton("中");
JButton button4 = new JButton("右");
JButton button5 = new JButton("下");
jf.add(button1,BorderLayout.NORTH);
jf.add(button2,BorderLayout.WEST);
jf.add(button3,BorderLayout.CENTER);
jf.add(button4,BorderLayout.EAST);
jf.add(button5,BorderLayout.SOUTH);
jf.setBounds(300,200,600,300);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setVisible(true);


}
}

效果如下:

流式布局管理器

FlowLayout(流式布局管理器)是 JPanel 和 JApplet 的默认布局管理器。

FlowLayout 布局管理器的构造方法如下。

  • FlowLayout():创建一个布局管理器,使用默认的居中对齐方式和默认 5 像素的水平和垂直间隔。
  • FlowLayout(int align):创建一个布局管理器,使用默认 5 像素的水平和垂直间隔。其中,align 表示组件的对齐方式,对齐的值必须是 FlowLayoutLEFT、FlowLayout.RIGHT 和 FlowLayout.CENTER,指定组件在这一行的位置是居左对齐、居右对齐或居中对齐。
  • FlowLayout(int align, int hgap,int vgap):创建一个布局管理器,其中 align 表示组件的对齐方式;hgap 表示组件之间的横向间隔;vgap 表示组件之间的纵向间隔,单位是像素。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Test0902{
public static void main(String[] args) {
JFrame jf = new JFrame("流式布局管理器");
JPanel jPanel = new JPanel();
JButton button1 = new JButton("1");
JButton button2 = new JButton("2");
JButton button3 = new JButton("3");
JButton button4 = new JButton("4");
JButton button5 = new JButton("5");
JButton button6 = new JButton("6");
JButton button7 = new JButton("7");
JButton button8 = new JButton("8");
JButton button9 = new JButton("9");
jPanel.add(button1);
jPanel.add(button2);
jPanel.add(button3);
jPanel.add(button4);
jPanel.add(button5);
jPanel.add(button6);
jPanel.add(button7);
jPanel.add(button8);
jPanel.add(button9);
// 向JPanel添加FlowLayout布局管理器,并将组建间的横向和纵向间隙都设置为20像素。
jPanel.setLayout(new FlowLayout(FlowLayout.LEADING,20,20));
jPanel.setBackground(Color.white);
jf.add(jPanel);
jf.setBounds(300,200,300,150);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}

上述代码中想JPanel面板中添加了9个按钮,但如果面板打下不允许的情况的按钮不会显示完全,同时会自动换行。

卡片布局管理器

CardLayout(卡片布局管理器)能够帮助用户实现多个成员共享同一个显不空间,并且一次只显示一个容器组件的内容。

CardLayout 布局管理器将容器分成许多层,每层的显示空间占据整个容器的大小,但是每层只允许放置一个组件。CardLayout 的构造方法如下。

  • CardLayout():构造一个新布局,默认间隔为 0。
  • CardLayout(int hgap, int vgap):创建布局管理器,并指定组件间的水平间隔(hgap)和垂直间隔(vgap)。

使用 CardLayout 类对容器内的两个面板进行布局。其中第一个面板上包括三个按钮,第二个面板上包括三个文本框。最后调用 CardLayout 类的 show() 方法显示指定面板的内容,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package com.org.test;

import javax.swing.*;
import java.awt.*;

public class CardLayoutDemo {
public static void main(String[] args) {
JFrame jf = new JFrame("卡片布局管理器");
JPanel jp1 = new JPanel();
JPanel jp2 = new JPanel();
JPanel cards = new JPanel(new CardLayout());
jp1.add(new JButton("登录"));
jp1.add(new JButton("注册"));
jp1.add(new JButton("找回密码"));
jp2.add(new JTextField("用户名"),20);
jp2.add(new JTextField("密码"),20);
jp2.add(new JTextField("验证码",20));
cards.add(jp1, "card1");
cards.add(jp2, "card2");
CardLayout c1 = (CardLayout) cards.getLayout();
c1.show(cards,"card1");
jf.add(cards);
jf.setBounds(300,200,400,200);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}

上述代码显示的是card1,

如果把c1.show(cards,"card1");中的card1改为card2:

网格布局管理器

GridLayout(网格布局管理器)为组件的放置位置提供了更大的灵活性。它将区域分割成行数(rows)和列数(columns)的网格状布局,组件按照由左至右、由上而下的次序排列填充到各个单元格中。

GridLayout 的构造方法如下。

  • GridLayout(int rows,int cols):创建一个指定行(rows)和列(cols)的网格布局。布局中所有组件的大小一样,组件之间没有间隔。
  • GridLayout(int rows,int cols,int hgap,int vgap):创建一个指定行(rows)和列(cols)的网格布局,并且可以指定组件之间横向(hgap)和纵向(vgap)的间隔,单位是像素。

提示:GridLayout 布局管理器总是忽略组件的最佳大小,而是根据提供的行和列进行平分。该布局管理的所有单元格的宽度和高度都是一样的。

使用 GridLayout 类的网格布局设计一个简单计算器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class GridLayoutDemo {
public static void main(String[] args) {
JFrame frame = new JFrame("GridLayou布局计算器");
JPanel panel = new JPanel(); //创建面板
//指定面板的布局为GridLayout,4行4列,间隙为5
panel.setLayout(new GridLayout(4, 4, 5, 5));
panel.add(new JButton("7")); //添加按钮
panel.add(new JButton("8"));
panel.add(new JButton("9"));
panel.add(new JButton("/"));
panel.add(new JButton("4"));
panel.add(new JButton("5"));
panel.add(new JButton("6"));
panel.add(new JButton("*"));
panel.add(new JButton("1"));
panel.add(new JButton("2"));
panel.add(new JButton("3"));
panel.add(new JButton("-"));
panel.add(new JButton("0"));
panel.add(new JButton("."));
panel.add(new JButton("="));
panel.add(new JButton("+"));
frame.add(panel); //添加面板到容器
frame.setBounds(300, 200, 200, 150);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}

效果图

网格包布局管理器

GridBagLayout(网格包布局管理器)是在网格基础上提供复杂的布局,是最灵活、 最复杂的布局管理器。

GridBagLayout 不需要组件的尺寸一致,允许组件扩展到多行多列。每个 GridBagLayout 对象都维护了一组动态的矩形网格单元,每个组件占一个或多个单元,所占有的网格单元称为组件的显示区域。

创建一个窗口,使用 GridBagLayout 进行布局,实现一个简易的手机拨号盘

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
class GridBagLayoutDemo
{
//向JFrame中添加JButton按钮
public static void makeButton(String title,JFrame frame,GridBagLayout gridBagLayout,GridBagConstraints constraints)
{
JButton button=new JButton(title); //创建Button对象
gridBagLayout.setConstraints(button,constraints);
frame.add(button);
}
public static void main(String[] agrs)
{
JFrame frame=new JFrame("拨号盘");
GridBagLayout gbaglayout=new GridBagLayout(); //创建GridBagLayout布局管理器
GridBagConstraints constraints=new GridBagConstraints();
frame.setLayout(gbaglayout); //使用GridBagLayout布局管理器
constraints.fill=GridBagConstraints.BOTH; //组件填充显示区域
constraints.weightx=0.0; //恢复默认值
constraints.gridwidth = GridBagConstraints.REMAINDER; //结束行
JTextField tf=new JTextField("13612345678");
gbaglayout.setConstraints(tf, constraints);
frame.add(tf);
constraints.weightx=0.5; // 指定组件的分配区域
constraints.weighty=0.2;
constraints.gridwidth=1;
makeButton("7",frame,gbaglayout,constraints); //调用方法,添加按钮组件
makeButton("8",frame,gbaglayout,constraints);
constraints.gridwidth=GridBagConstraints.REMAINDER; //结束行
makeButton("9",frame,gbaglayout,constraints);
constraints.gridwidth=1; //重新设置gridwidth的值

makeButton("4",frame,gbaglayout,constraints);
makeButton("5",frame,gbaglayout,constraints);
constraints.gridwidth=GridBagConstraints.REMAINDER;
makeButton("6",frame,gbaglayout,constraints);
constraints.gridwidth=1;

makeButton("1",frame,gbaglayout,constraints);
makeButton("2",frame,gbaglayout,constraints);
constraints.gridwidth=GridBagConstraints.REMAINDER;
makeButton("3",frame,gbaglayout,constraints);
constraints.gridwidth=1;

makeButton("返回",frame,gbaglayout,constraints);
constraints.gridwidth=GridBagConstraints.REMAINDER;
makeButton("拨号",frame,gbaglayout,constraints);
constraints.gridwidth=1;
frame.setBounds(400,400,400,400); //设置容器大小
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
  1. gridx 和 gridy

用来指定组件左上角在网格中的行和列。容器中最左边列的 gridx 为 0,最上边行的 gridy 为 0。这两个变量的默认值是 GridBagConstraints.RELATIVE,表示对应的组件将放在前一个组件的右边或下面。

  1. gridwidth 和 gridheight

用来指定组件显示区域所占的列数和行数,以网格单元而不是像素为单位,默认值为 1。

  1. fill

指定组件填充网格的方式,可以是如下值:GridBagConstraints.NONE(默认值)、GridBagConstraints.HORIZONTAL(组件横向充满显示区域,但是不改变组件高度)、GridBagConstraints.VERTICAL(组件纵向充满显示区域,但是不改变组件宽度)以及 GridBagConstraints.BOTH(组件横向、纵向充满其显示区域)。

  1. ipadx 和 ipady

指定组件显示区域的内部填充,即在组件最小尺寸之外需要附加的像素数,默认值为 0。

  1. insets

指定组件显示区域的外部填充,即组件与其显示区域边缘之间的空间,默认组件没有外部填充。

  1. anchor

指定组件在显示区域中的摆放位置。可选值有 GridBagConstraints.CENTER(默认值)、GridBagConstraints.NORTH、GridBagConstraints.
NORTHEAST、GridBagConstraints.EAST、GridBagConstraints.SOUTH、GridBagConstraints.SOUTHEAST、GridBagConstraints.WEST、GridBagConstraints.SOUTHWEST 以及 GridBagConstraints.NORTHWEST。

  1. weightx 和 weighty

用来指定在容器大小改变时,增加或减少的空间如何在组件间分配,默认值为 0,即所有的组件将聚拢在容器的中心,多余的空间将放在容器边缘与网格单元之间。weightx 和 weighty 的取值一般在 0.0 与 1.0 之间,数值大表明组件所在的行或者列将获得更多的空间。

盒布局管理器

BoxLayout(盒布局管理器)通常和 Box 容器联合使用,Box 类有以下两个静态方法。

  • createHorizontalBox():返回一个 Box 对象,它采用水平 BoxLayout,即 BoxLayout 沿着水平方向放置组件,让组件在容器内从左到右排列。
  • createVerticalBox():返回一个 Box 对象,它采用垂直 BoxLayout,即 BoxLayout 沿着垂直方向放置组件,让组件在容器内从上到下进行排列。

Box 还提供了用于决定组件之间间隔的静态方法,如表 1 所示。

网格包布局 说明
static Component createHorizontalGlue() 创建一个不可见的、可以被水平拉伸和收缩的组件
static Component createVerticalGlue() 创建一个不可见的、可以被垂直拉伸和收缩的组件
static Component createHorizontalStrut(int width) 创建一个不可见的、固定宽度的组件
static Component createVerticalStrut(int height) 创建一个不可见的、固定高度的组件
static Component createRigidArea(Dimension d) 创建一个不可见的、总是具有指定大小的组件

BoxLayout 类只有一个构造方法,如下所示。

1
BoxLayout(Container c,int axis)

使用 BoxLayout 类对容器内的 4 个按钮进行布局管理,使两个按钮为横向排列,另外两个按钮为纵向排列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class BoxLayoutDemo
{
public static void main(String[] agrs)
{
JFrame frame=new JFrame("Java示例程序");
Box b1=Box.createHorizontalBox(); //创建横向Box容器
Box b2=Box.createVerticalBox(); //创建纵向Box容器
frame.add(b1); //将外层横向Box添加进窗体
b1.add(Box.createVerticalStrut(200)); //添加高度为200的垂直框架
b1.add(new JButton("西")); //添加按钮1
b1.add(Box.createHorizontalStrut(140)); //添加长度为140的水平框架
b1.add(new JButton("东")); //添加按钮2
b1.add(Box.createHorizontalGlue()); //添加水平胶水
b1.add(b2); //添加嵌套的纵向Box容器
//添加宽度为100,高度为20的固定区域
b2.add(Box.createRigidArea(new Dimension(100,20)));
b2.add(new JButton("北")); //添加按钮3
b2.add(Box.createVerticalGlue()); //添加垂直组件
b2.add(new JButton("南")); //添加按钮4
b2.add(Box.createVerticalStrut(40)); //添加长度为40的垂直框架
//设置窗口的关闭动作、标题、大小位置以及可见性等
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(100,100,400,200);
frame.setVisible(true);
}
}

Swing组件

标签组件

在添加了容器并指定了布局管理方式之后,便可以向容器中添加各种展示类的组件,像标签、按钮、单选和多选框等。

对于只包含文本的标签可以使用 JLabel 类,该类的主要构造方法有如下几种形式。

  • JLabel():创建无图像并且标题为空字符串的 JLabel。
  • JLabel(Icon image):创建具有指定图像的 JLabel。
  • JLabel(String text):创建具有指定文本的 JLabel。
  • JLabel(String textjcon image,int horizontalAlignment):创建具有指定文本、图像和水平对齐方式的 JLabel,horizontalAlignment 的取值有 3 个,即 JLabel.LEFT、JLabel.RIGHT 和 JLabel.CENTER。

使用 JFrame 组件创建一个窗口,然后向窗口中添加 3 个标签,这 3 个标签分别使用不同的创建方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class JLabelDemo
{
public static void main(String[] agrs)
{
JFrame frame=new JFrame("Java标签组件示例"); //创建Frame窗口
JPanel jp=new JPanel(); //创建面板
JLabel label1=new JLabel("这是一个标签"); //创建标签
JLabel label2=new JLabel();
label2.setText("这还是一个标签");
ImageIcon img=new ImageIcon("C:\\Users\\Administrator\\Pictures\\Camera Roll\\bg.png"); //创建一个图标
//创建既含有文本又含有图标的JLabel对象
JLabel label3=new JLabel("这是一个图片标签",img,JLabel.CENTER);
jp.add(label1); //添加标签到面板
jp.add(label2);
jp.add(label3);
frame.add(jp);
frame.setBounds(300,200,400,400);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}

按钮组件

按钮是图形界面上常见的元素,在前面已经多次使用过它。JButton 类的常用构造方法如下。

  • JButton():创建一个无标签文本、无图标的按钮。
  • JButton(Icon icon):创建一个无标签文本、有图标的按钮。
  • JButton(String text):创建一个有标签文本、无图标的按钮。
  • JButton(String text,Icon icon):创建一个有标签文本、有图标的按钮

Button 类的常用方法如表 1 所示。

方法名称 说明
addActionListener(ActionListener listener) 为按担组件注册 ActionListener 监听
void setIcon(Icon icon) 设置按钮的默认图标
void setText(String text) 设置按鈕的文本
void setMargin(Insets m) 设置按钮边框和标签之间的空白
void setMnemonic(int nmemonic) 设置按钮的键盘快捷键,所设置的快捷键在实际操作时需要结合 Alt 键进行实现
void setPressedIcon(Icon icon) 设置按下按钮时的图标
void setSelectedIcon(Icon icon) 设置选择按鈕时的图标
void setRolloveiicon(Icon icon) 设置鼠标移动到按扭区域时的图标
void setDisabledIcon(Icon icon) 设置按钮无效状态下的图标
void setVerticalAlignment(int alig) 设置图标和文本的垂直对齐方式
void setHorizontalAlignment(int alig) 设置图标和文本的水平对齐方式
void setEnable(boolean flag) 启用或禁用按扭
void setVerticalTextPosition(int textPosition) 设置文本相对于图标的垂直位置
void setHorizontalTextPosition(int textPosition) 设置文本相对于图标的水平位置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class JButtonDemo
{
public static void main(String[] args)
{
JFrame frame=new JFrame("Java按钮组件示例"); //创建Frame窗口
frame.setSize(400, 200);
JPanel jp=new JPanel(); //创建JPanel对象
JButton btn1=new JButton("我是普通按钮"); //创建JButton对象
JButton btn2=new JButton("我是带背景颜色按钮");
JButton btn3=new JButton("我是不可用按钮");
JButton btn4=new JButton("我是底部对齐按钮");
jp.add(btn1);
btn2.setBackground(Color.YELLOW); //设置按钮背景色
jp.add(btn2);
btn3.setEnabled(false); //设置按钮不可用
jp.add(btn3);
Dimension preferredSize=new Dimension(160, 60); //设置尺寸
btn4.setPreferredSize(preferredSize); //设置按钮大小
btn4.setVerticalAlignment(SwingConstants.BOTTOM); //设置按钮垂直对齐方式
jp.add(btn4);
frame.add(jp);
frame.setBounds(300, 200, 600, 300);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}

单行文本框

使用 JTextField 类实现一个单行文本框,它允许用户输入单行的文本信息。该类的常用构造方法如下。

  • JTextField():创建一个默认的文本框。
  • JTextField(String text):创建一个指定初始化文本信息的文本框。
  • JTextField(int columns):创建一个指定列数的文本框。
  • JTextField(String text,int columns):创建一个既指定初始化文本信息,又指定列数的文本框。

JTextField 类的常用方法如表 1 所示。

方法名称 说明
Dimension getPreferredSize() 获得文本框的首选大小
void scrollRectToVisible(Rectangle r) 向左或向右滚动文本框中的内容
void setColumns(int columns) 设置文本框最多可显示内容的列数
void setFont(Font f) 设置文本框的字体
void setScrollOffset(int scrollOffset) 设置文本框的滚动偏移量(以像素为单位)
void setHorizontalAlignment(int alignment) 设置文本框内容的水平对齐方式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class JTextFieldDemo {
public static void main(String[] agrs) {
JFrame frame = new JFrame("Java文本框组件示例"); //创建Frame窗口
JPanel jp = new JPanel(); //创建面板
JTextField txtfield1 = new JTextField(); //创建文本框
txtfield1.setText("普通文本框"); //设置文本框的内容
JTextField txtfield2 = new JTextField(28);
txtfield2.setFont(new Font("楷体", Font.BOLD, 16)); //修改字体样式
txtfield2.setText("指定长度和字体的文本框");
JTextField txtfield3 = new JTextField(30);
txtfield3.setText("居中对齐");
txtfield3.setHorizontalAlignment(JTextField.CENTER); //居中对齐
jp.add(txtfield1);
jp.add(txtfield2);
jp.add(txtfield3);
frame.add(jp);
frame.setBounds(300, 200, 400, 100);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}

文本域

文本域与文本框的最大区别就是文本域允许用户输入多行文本信息。

使用 JTextArea 类实现一个文本域,其常用构造方法如下。

  • JTextArea():创建一个默认的文本域。
  • JTextArea(int rows,int columns):创建一个具有指定行数和列数的文本域。
  • JTextArea(String text):创建一个包含指定文本的文本域。
  • JTextArea(String text,int rows,int columns):创建一个既包含指定文本,又包含指定行数和列数的多行文本域。

JTextArea 类的常用方法如表 1 所示。

方法名称 说明
void append(String str) 将字符串 str 添加到文本域的最后位置
void setColumns(int columns) 设置文本域的行数
void setRows(int rows) 设置文本域的列数
int getColumns() 获取文本域的行数
void setLineWrap(boolean wrap) 设置文本域的换行策略
int getRows() 获取文本域的列数
void insert(String str,int position) 插入指定的字符串到文本域的指定位置
void replaceRange(String str,int start,int end) 将指定的开始位 start 与结束位 end 之间的字符串用指定的字符串 str 取代

使用 JFrame 组件创建一个窗口,再向窗口中添加一个文本域,并将文本域中的文本设置为自动换行,允许显示滚动条。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class JTextAreaDemo {
public static void main(String[] agrs) {
JFrame frame = new JFrame("Java文本域组件示例"); //创建Frame窗口
JPanel jp = new JPanel(); //创建一个JPanel对象
JTextArea jta = new JTextArea("请输入内容", 7, 30);
jta.setLineWrap(true); //设置文本域中的文本为自动换行
jta.setForeground(Color.BLACK); //设置组件的背景色
jta.setFont(new Font("楷体", Font.BOLD, 16)); //修改字体样式
jta.setBackground(Color.YELLOW); //设置按钮背景色
JScrollPane jsp = new JScrollPane(jta); //将文本域放入滚动窗口
Dimension size = jta.getPreferredSize(); //获得文本域的首选大小
jsp.setBounds(110, 90, size.width, size.height);
jp.add(jsp); //将JScrollPane添加到JPanel容器中
frame.add(jp); //将JPanel容器添加到JFrame容器中
frame.setBackground(Color.LIGHT_GRAY);
frame.setSize(400, 200); //设置JFrame容器的大小
frame.setVisible(true);
}
}

复选框组件

一个复选框有选中和未选中两种状态,并且可以同时选定多个复选框。使用 JCheckBox 类实现复选框,该类的常用构造方法如下。

  • JCheckBox():创建一个默认的复选框,在默认情况下既未指定文本,也未指定图像,并且未被选择。
  • JCheckBox(String text):创建一个指定文本的复选框。
  • JCheckBox(String text,boolean selected):创建一个指定文本和选择状态的复选框
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class JCheckBoxDemo {
public static void main(String[] args) {
JFrame frame=new JFrame("Java复选组件示例"); //创建Frame窗口
JPanel jp=new JPanel(); //创建面板
JLabel label=new JLabel("流行编程语言有:");
label.setFont(new Font("楷体",Font.BOLD,16)); //修改字体样式
JCheckBox chkbox1=new JCheckBox("C#", true); //创建指定文本和状态的复选框
JCheckBox chkbox2=new JCheckBox("C++"); //创建指定文本的复选框
JCheckBox chkbox3=new JCheckBox("Java"); //创建指定文本的复选框
JCheckBox chkbox4=new JCheckBox("Python"); //创建指定文本的复选框
JCheckBox chkbox5=new JCheckBox("PHP"); //创建指定文本的复选框
JCheckBox chkbox6=new JCheckBox("Perl"); //创建指定文本的复选框
jp.add(label);
jp.add(chkbox1);
jp.add(chkbox2);
jp.add(chkbox3);
jp.add(chkbox4);
jp.add(chkbox5);
jp.add(chkbox6);
frame.add(jp);
frame.setBounds(300,200,400,100);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}

单选按钮

JRadioButton 类的常用构造方法如下。

  • JRadioButton():创建一个初始化为未选择的单选按钮,其文本未设定。
  • JRadioButton(Icon icon):创建一个初始化为未选择的单选按钮,其具有指定的图像但无文本。
  • JRadioButton(Icon icon,boolean selected):创建一个具有指定图像和选择状态的单选按钮,但无文本。
  • JRadioButton(String text):创建一个具有指定文本但未选择的单选按钮。
  • JRadioButton(String text,boolean selected):创建一个具有指定文本和选择状态的单选按钮。
  • JRadioButton(String text,Icon icon):创建一个具有指定的文本和图像并初始化为未选择的单选按钮。
  • JRadioButton(String text,Icon icon,boolean selected):创建一个具有指定的文本、图像和选择状态的单选按钮。

使用 JFrame 组件创建一个窗口,然后使用 JRadioButton 类创建一个选择季节的单选按钮组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class JRadioButtonDemo 
{
public static void main(String[] agrs)
{
JFrame frame=new JFrame("Java单选组件示例"); //创建Frame窗口
JPanel panel=new JPanel(); //创建面板
JLabel label1=new JLabel("现在是哪个季节:");
JRadioButton rb1=new JRadioButton("春天"); //创建JRadioButton对象
JRadioButton rb2=new JRadioButton("夏天"); //创建JRadioButton对象
JRadioButton rb3=new JRadioButton("秋天",true); //创建JRadioButton对象
JRadioButton rb4=new JRadioButton("冬天"); //创建JRadioButton对象
label1.setFont(new Font("楷体",Font.BOLD,16)); //修改字体样式
ButtonGroup group=new ButtonGroup();
//添加JRadioButton到ButtonGroup中
group.add(rb1);
group.add(rb2);
panel.add(label1);
panel.add(rb1);
panel.add(rb2);
panel.add(rb3);
panel.add(rb4);
frame.add(panel);
frame.setBounds(300, 200, 400, 100);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}

下拉列表

下拉列表的特点是将多个选项折叠在一起,只显示最前面的或被选中的一个

下拉列表由 JComboBox 类实现,常用构造方法如下。

  • JComboBox():创建一个空的 JComboBox 对象。
  • JComboBox(ComboBoxModel aModel):创建一个 JComboBox,其选项取自现有的 ComboBoxModel。
  • JComboBox(Object[] items):创建包含指定数组中元素的 JComboBox。

JComboBox 类提供了多个成员方法用于操作下拉列表框中的项,如表 1 所示。

方法名称 说明
void addItem(Object anObject) 将指定的对象作为选项添加到下拉列表框中
void insertItemAt(Object anObject,int index) 在下拉列表框中的指定索引处插入项
void removeltem(0bject anObject) 在下拉列表框中删除指定的对象项
void removeItemAt(int anlndex) 在下拉列表框中删除指定位置的对象项
void removeAllItems() 从下拉列表框中删除所有项
int getItemCount() 返回下拉列表框中的项数
Object getItemAt(int index) 获取指定索引的列表项,索引从 0 开始
int getSelectedIndex() 获取当前选择的索引
Object getSelectedltem() 获取当前选择的项

JComboBox 能够响应 ItemEvent 事件和 ActionEvent 事件,其中 ItemEvent 触发的时机是当下拉列表框中的所选项更改时,ActionEvent 触发的时机是当用户在 JComboBox 上直接输入选择项并回车时。要处理这两个事件,需要创建相应的事件类并实现 ItemListener 接口和 ActionListener 接口。

使用 JFrame 组件创建一个窗口,然后使用 JComboBox 类创建一个包含4个选项的下拉列表框。具体实现代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class JComboBoxDemo {
public static void main(String[] args) {
JFrame frame = new JFrame("Java下拉列表组件示例");
JPanel jp = new JPanel(); //创建面板
JLabel label1 = new JLabel("证件类型:"); //创建标签
JComboBox cmb = new JComboBox(); //创建JComboBox
cmb.addItem("--请选择--"); //向下拉列表中添加一项
cmb.addItem("身份证");
cmb.addItem("驾驶证");
cmb.addItem("军官证");
jp.add(label1);
jp.add(cmb);
frame.add(jp);
frame.setBounds(300, 200, 400, 100);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}

列表框

列表框与下拉列表的区别不仅仅表现在外观上,当激活下拉列表时,会出现下拉列表框中的内容。但列表框只是在窗体系上占据固定的大小,如果需要列表框具有滚动效果,可以将列表框放到滚动面板中。当用户选择列表框中的某一项时,按住 Shift 键并选择列表框中的其他项目,可以连续选择两个选项之间的所有项目,也可以按住 Ctrl 键选择多个项目。

Swing 中使用 JList 类来表示列表框,该类的常用构造方法如下。

  • JList():构造一个空的只读模型的列表框。
  • JList(ListModel dataModel):根据指定的非 null 模型对象构造一个显示元素的列表框。
  • JList(Object[] listData):使用 listData 指定的元素构造—个列表框。
  • JList(Vector<?> listData):使用 listData 指定的元素构造一个列表框。

上述的第一个构造方法没有参数,使用此方法创建列表框后可以使用 setListData() 方法对列表框的元素进行填充,也可以调用其他形式的构造方法在初始化时对列表框的元素进行填充。常用的元素类型有 3 种,分别是数组、Vector 对象和 ListModel 模型。

用 JFmme 组件创建一个窗口,然后使用 JList 类创建一个包含3个选项的列表框。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class JListDemo {
public static void main(String[] args) {
JFrame frame = new JFrame("Java列表框组件示例");
JPanel jp = new JPanel(); //创建面板
JLabel label1 = new JLabel("证件类型:"); //创建标签
String[] items = new String[]{"身份证", "驾驶证", "军官证"};
JList list = new JList(items); //创建JList
jp.add(label1);
jp.add(list);
frame.add(jp);
frame.setBounds(300, 200, 400, 100);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}