基于Java Swing界面编程
Swing是Java基础类的一部分,是一个为Java设计的GUI工具包。
Swing包含了诸多图形用户界面(GUI)器件,提供了许多比awt更好的屏幕显示元素。
本教程将全面简要介绍Java Swing开发的相关知识,帮助读者快速入门。
文章目录
第一部分 组件
1.1 Java Swing组件之间的继承关系
一个 Java的图形界面,是由各种不同类型的“元素”(诸如窗口、菜单栏、对话框、标签、按钮、文本框等)所组成的,它们被统一称之为组件(Component)。他们之间的继承关系如下图所示:
1.2 窗口组件
JFrame和JDialog属于窗口类组件,可以独立显示,一个图形界面至少需要一个窗口,而绝大多数的图形用户界面都采用JFrame作为窗口。
1.2.1 JFrame
JFrame是可以独立显示的窗口组件。一个窗口组件通常含有标题、图标、操作按钮(关闭、最小化、最大化)等内容。
a.JFrame的构造方法
构造方法 | 语法 | 功能 |
---|---|---|
无参构造方法 | JFrame() | 创建一个没有标题的窗口对象 |
含参构造方法 | JFrame(String s) | 创建一个标题为"s"的窗口对象 |
b.JFrame的常用方法
方法 | 功能 |
---|---|
void setTitle(String s) | 设置窗口的标题 |
void setSize(int width, int height) | 设置窗口的大小 |
void setLocation(int x, int y) | 设置窗口的位置 |
void setBounds(int x, int y, int width, int height) | 同时设置窗口的位置和大小 |
void setVisible(boolean b) | 设置窗口是否可见,默认不可见 |
void setResizable(boolean b) | 设置窗口是否可以调整大小,默认可调整 |
void dispose() | 销毁窗口, 释放窗口占用的资源,调用setVisible(true)则可重构 |
void pack() | 调整窗口的大小, 使其适合子组件的大小和布局 |
void setDefaultCloseOperation(int operation) | 设置窗口关闭按钮点击后的默认操作 |
tip:setDefaultCloseOperation方法的参考值:
- WindowConstants.DO_NOTHING_ON_CLOSE: 不执行任何操作
- WindowConstants.HIDE_ON_CLOSE: 隐藏窗口, 调用setVisible(true)则可重构
- WindowConstants.DISPOSE_ON_CLOSE: 销毁窗口, 释放窗口占用的资源
- WindowConstants.EXIT_ON_CLOSE: 结束窗口所在的应用程序
c.实例展示
综合利用上述方法创建一个示例:
import javax.swing.*;
public class JFrameTest {
public static void main(String[] args) {
JFrame jf = new JFrame();
jf.setTitle("这是一个JFrame测试");
jf.setSize(400, 250);
jf.setLocation(400, 300);
jf.setVisible(true);
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
}
运行结果展示:
更多细致内容在此不展开,可以查阅官方API文档仔细学习:Class JFrame
1.2.2 JDialog
JDialog是从一个窗口中弹出的另一个窗口。使用该类可以自定义创建对话框。JDialog与JFrame用法相似,但JDialog必须从属于一个Frame。
a.JDialog的构造方法
构造方法 | 语法 | 功能 |
---|---|---|
无参构造方法 | JDialog() | 创建一个没有标题没有父窗口的对话框 |
含参构造方法 | JDialog(Frame f) | 创建一个父窗口为f的对话框 |
含参构造方法 | JDialog(Frame f, String s) | 创建一个标题为"s"、父窗口为f的对话框 |
b.JDialog的常用方法
与JFrame的常用方法一致
但需要注意:setDefaultCloseOperation方法的参考值中没有WindowConstants.EXIT_ON_CLOSE
c.实例展示
综合利用上述方法创建一个示例:
import javax.swing.*;
public class JDialogTest {
public static void main(String[] args) {
JFrame jf = new JFrame();
jf.setTitle("这是一个JFrame");
jf.setSize(400, 250);
jf.setLocation(400, 300);
jf.setVisible(true);
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
JDialog jd = new JDialog(jf, "这是一个JDialog");
jd.setSize(200, 150);
jd.setLocation(450, 350);
jd.setVisible(true);
jd.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
}
}
运行结果展示:
更多细致内容在此不展开,可以查阅官方API文档仔细学习:Class JDialog
1.3 面板组件
Jpanel和JScrollPane等属于面板类组件,可以作为容器用来容纳其他的组件,但这些组件必须被添加在一个容器内。
1.3.1 JPanel
JPanel是一种使用频率非常高的简单的面板容器组件。
a.JPanel的构造方法
构造方法 | 语法 | 功能 |
---|---|---|
无参构造方法 | JPanel() | 创建默认使用流式布局的面板 |
含参构造方法 | JPanel(LayoutManager l) | 创建布局管理器为l的面板 |
b.实例展示
创建一个示例:
import javax.swing.*;
public class JPanelTest {
public static void main(String[] args) {
JFrame jf = new JFrame();
jf.setTitle("这是一个JFrame");
jf.setSize(400, 250);
jf.setLocation(400, 300);
jf.setVisible(true);
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
JButton jb1 = new JButton("按钮1"); //这里创建两个按钮用来摆放在面板内部
JButton jb2 = new JButton("按钮2");
JPanel jp = new JPanel();
jp.add(jb1); //把按钮添加入面板
jp.add(jb2);
jf.add(jp); //把面板添加入窗口
}
}
运行结果展示:
更多细致内容在此不展开,可以查阅官方API文档仔细学习:Class JPanel
1.3.2 JScrollPane
JScrollPane是一种滚动面板容器组件,支持水平和垂直滚动视图。JScrollPane内只能添加一个组件,如果需要向JScrollPane内添加多个组件,需要先将多个组件添加至一个Jpanel组件中,再将该JPanel添加至JScrollPane中。
a.JScrollPane的构造方法
构造方法 | 语法 | 功能 |
---|---|---|
无参构造方法 | JScrollPane() | 创建面板 |
含参构造方法 | JScrollPane(Component view) | 创建面板,其中view为需要滚动显示的视图组件 |
含参构造方法 | JScrollPane(Component view, int v, int h) | 创建面板,其中view为需要滚动显示的视图组件,v、h分别为垂直、水平滚动条显示策略 |
含参构造方法 | JScrollPane(int v, int h) | 创建面板,其中v、h分别为垂直、水平滚动条显示策略 |
tip:垂直滚动条显示策略的参考值:
- ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED:需要时显示(默认)
- ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER:从不显示
- ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS:总是显示
tip:水平滚动条显示策略的参考值:
- ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED:需要时显示(默认)
- ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER:从不显示
- ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS:总是显示
b.JScrollPane的常用方法
方法 | 功能 |
---|---|
void setViewportView(Component view) | 设置滚动显示视图内容组件 |
void setVerticalScrollBarPolicy(int v) | 设置垂直滚动条的显示策略 |
void setHorizontalScrollBarPolicy(int h) | 设置水平滚动条的显示策略 |
void setWheelScrollingEnabled(boolean b) | 设置是否响应鼠标滚动事件,默认响应 |
c.实例展示
创建一个示例:
import javax.swing.*;
public class JScrollPaneTest {
public static void main(String[] args) {
JFrame jf = new JFrame();
jf.setTitle("这是一个JFrame");
jf.setSize(250, 250);
jf.setLocation(400, 300);
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
JButton jb1 = new JButton("按钮1"); //这里创建两个按钮用来摆放在面板内部
jb1.setSize(200, 200);
JScrollPane jp = new JScrollPane(jb1, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
jf.setContentPane(jp); //把面板添加入窗口
jf.setVisible(true);
}
}
运行结果展示:
上图中因为布局原因可以发现按钮填满了整个窗口,这会在后续内容详细介绍。
更多细致内容在此不展开,可以查阅官方API文档仔细学习:Class JScrollPane
1.3.3 其他面板组件
还有许多面板组件如下:
组件 | 概述 | |
---|---|---|
1 | JSplitPane | 分隔面板 |
2 | JTabbedPane | 选项卡面板 |
3 | JLayeredPane | 层级面板 |
4 | JMenuBar | 菜单栏 |
5 | JToolBar | 工具栏 |
6 | JPopupMenu | 弹出菜单 |
7 | JInternalFrame | 内部弹窗 |
在此不做详细介绍,如有需要可以详细查阅官方API或其他博主的博文。
1.4 标签组件
JLabel标签组件主要用于展示文本或图片,也可以同时显示文本和图片。
a.JLabel的构造方法
构造方法 | 语法 | 功能 |
---|---|---|
无参构造方法 | JLabel() | 创建默认空白标签 |
含参构造方法 | JLabel(String text) | 创建标签,设置文本为text |
含参构造方法 | JLabel(Icon image) | 创建标签,设置图标为image |
含参构造方法 | JLabel(String text, Icon image, int horizontalAlignment) | 创建标签,设置文本、图标、对齐方式 |
b.JLabel的常用方法
方法 | 功能 |
---|---|
void setText(String text) | 设置文本 |
void setIcon(Icon icon) | 设置图片 |
void setFont(Font font) | 设置文本的字体类型、样式和大小 |
void setForeground(Color fg) | 设置字体颜色 |
void setToolTipText(String text) | 当鼠标移动到组件上时显示的提示文本 |
void setBackground(Color bg) | 设置组件的背景颜色 |
void setVisible(boolean visible) | 设置组件是否可见 |
void setOpaque(boolean isOpaque) | 设置组件是否为不透明,默认为透明 |
tip:显示图片时,可以不选择创建Icon实例,转而创建ImageIcon实例。
c.实例展示
创建一个示例:
import javax.swing.*;
public class JLabelTest {
public static void main(String[] args) {
JFrame jf = new JFrame();
jf.setTitle("这是一个JFrame");
jf.setSize(250, 250);
jf.setLocation(400, 300);
JLabel jl1 = new JLabel("账号", SwingConstants.CENTER);
jf.add(jl1);
jf.setVisible(true);
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
}
运行结果展示:
更多细致内容在此不展开,可以查阅官方API文档仔细学习:Class JLabel
1.5 按钮组件
JButton按钮组件主要用于创建按钮。
a.JButton的构造方法
构造方法 | 语法 | 功能 |
---|---|---|
无参构造方法 | JButton() | 创建不带有文本或图标的按钮 |
含参构造方法 | JButton(String text) | 创建一个带文本的按钮 |
含参构造方法 | JButton(Icon icon) | 创建一个带图标的按钮 |
含参构造方法 | JButton(String text, Icon icon) | 创建一个带文本、图标的按钮 |
b.JButton的常用方法
方法 | 功能 |
---|---|
void setText(String text) | 设置文本 |
void setFont(Font font) | 设置文本的字体类型、样式和大小 |
void setForeground(Color fg) | 设置字体颜色 |
void setEnabled(boolean enable) | 设置按钮是否可用 |
void setBorderPainted(boolean b) | 设置是否显示绘制边框 |
void setTooltipText(String text) | 设置提示文本 |
c.实例展示
创建一个示例:
import java.awt.*;
import javax.swing.*;
public class JButtonTest {
public static void main(String[] args) {
JFrame jf = new JFrame("这是一个JFrame");
jf.setLayout(new FlowLayout());
jf.setSize(400, 250);
jf.setLocation(400, 300);
JButton jb = new JButton("按钮");
jb.setEnabled(true);
jb.setBorderPainted(false);
jf.add(jb);
jf.setVisible(true);
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
}
运行结果展示:
更多细致内容在此不展开,可以查阅官方API文档仔细学习:Class JButton
1.6 单选按钮组件
JRadioButton单选按钮组件主要用于创建单选按钮,当有多个单选按钮时,根据需要可以将多个单选按钮放入一个ButtonGroup(按钮组)中,来实现多选一的情境。
a.JRadioButton的构造方法
构造方法 | 语法 | 功能 |
---|---|---|
无参构造方法 | JRadioButton() | 创建不带有文本或图标的单选按钮 |
含参构造方法 | JRadioButton(String text) | 创建一个带文本的单选按钮 |
含参构造方法 | JRadioButton(Icon icon) | 创建一个带图标的单选按钮 |
含参构造方法 | JRadioButton(String text, Icon icon) | 创建一个带文本、图标的单选按钮 |
含参构造方法 | JRadioButton(String text, Icon icon, boolean selected) | 创建一个带文本、图标的单选按钮,并指定是否被选中 |
b.JRadioButton的常用方法
方法 | 功能 |
---|---|
void setText(String text) | 设置文本 |
void setFont(Font font) | 设置文本的字体类型、样式和大小 |
void setForeground(Color fg) | 设置字体颜色 |
void setEnabled(boolean enable) | 设置按钮是否可用 |
void setSelected(boolean b) | 设置按钮是否被选中 |
c.ButtonGroup按钮组的创建与使用
创建按钮组:
ButtonGroup btnGroup = new ButtonGroup();
将单选按钮添加至按钮组:
btnGroup.add();
d.实例展示
创建一个示例:
import java.awt.*;
import javax.swing.*;
public class JRadioButtonTest {
public static void main(String[] args) {
JFrame jf = new JFrame("这是一个JFrame");
jf.setLayout(new FlowLayout()); // 使用流式布局防止按钮填满整个页面
jf.setSize(400, 250);
jf.setLocation(400, 300);
JRadioButton jrb1 = new JRadioButton("男");
JRadioButton jrb2 = new JRadioButton("女");
jrb1.setEnabled(true);
jrb1.setSelected(true);
jrb2.setEnabled(true);
ButtonGroup btnGroup = new ButtonGroup();
btnGroup.add(jrb1);
btnGroup.add(jrb2);
jf.add(jrb1);
jf.add(jrb2);
jf.setVisible(true);
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
}
运行结果展示:
更多细致内容在此不展开,可以查阅官方API文档仔细学习:Class JRadioButton
1.7 复选框按钮组件
JCheckBox复选框按钮组件主要用于创建复选框。
a.JCheckBox的构造方法
构造方法 | 语法 | 功能 |
---|---|---|
无参构造方法 | JCheckBox() | 创建不带有文本或图标的复选框 |
含参构造方法 | JCheckBox(String text, boolean selected) | 创建一个带文本的复选框,同时指定是否被选中 |
含参构造方法 | JRadioButton(Icon icon, boolean selected) | 创建一个带图标的复选框,同时指定是否被选中 |
b.JCheckBox的常用方法
方法 | 功能 |
---|---|
void setText(String text) | 设置文本 |
void setFont(Font font) | 设置文本的字体类型、样式和大小 |
void setForeground(Color fg) | 设置字体颜色 |
void setEnabled(boolean enable) | 设置复选框是否可用 |
void setSelected(boolean b) | 设置复选框是否被选中 |
c.实例展示
创建一个示例:
import java.awt.*;
import javax.swing.*;
public class JCheckBoxTest {
public static void main(String[] args) {
JFrame jf = new JFrame("这是一个JFrame");
jf.setLayout(new FlowLayout()); // 使用流式布局防止按钮填满整个页面
jf.setSize(400, 250);
jf.setLocation(400, 300);
JCheckBox jcb1 = new JCheckBox("0~8岁");
JCheckBox jcb2 = new JCheckBox("8~12岁");
JCheckBox jcb3 = new JCheckBox("12~16岁");
JCheckBox jcb4 = new JCheckBox("16~18岁");
JCheckBox jcb5 = new JCheckBox("18岁以上");
jcb1.setEnabled(true);
jcb2.setEnabled(true);
jcb3.setEnabled(true);
jcb4.setEnabled(true);
jcb5.setEnabled(true);
jf.add(jcb1);
jf.add(jcb2);
jf.add(jcb3);
jf.add(jcb4);
jf.add(jcb5);
jf.setVisible(true);
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
}
运行结果展示:
更多细致内容在此不展开,可以查阅官方API文档仔细学习:Class JCheckBox
1.8 下拉列表框组件
JComboBox是下拉列表框按钮组件。JComboBox可以以下拉列表的形式展示多个选项,用户可以从下拉列表中选择一个值,其中的选项内容则由一个ComboBoxModel实例来维护。
a.JComboBox的构造方法
构造方法 | 语法 | 功能 |
---|---|---|
无参构造方法 | JComboBox() | 创建空白下拉列表框 |
含参构造方法 | JComboBox(ComboBoxModel model) | 创建下拉列表框,用ComboBoxModel实例维护选项 |
含参构造方法 | JComboBox(Object[] items) | 创建下拉列表框,用数组维护选项 |
含参构造方法 | JComboBox(Vector<?> items) | 创建下拉列表框,用Vector维护选项 |
b.JComboBox的常用方法
方法 | 功能 |
---|---|
void setSelectedIndex(int index) | 设置选中的索引 |
int getSelectedIndex() | 获取当前选中的索引 |
Object getSelectedItem() | 获取当前选中的数据项 |
void setEditable(boolean flag) | 设置下拉列表框是否可编辑,默认不可编辑 |
void addItem(Object anObject) | 为下拉列表框添加选项 |
c.实例展示
创建一个示例:
import java.awt.*;
import javax.swing.*;
public class JComboBoxTest {
public static void main(String[] args) {
JFrame jf = new JFrame("这是一个JFrame");
jf.setLayout(new FlowLayout()); // 使用流式布局防止按钮填满整个页面
jf.setSize(400, 250);
jf.setLocation(400, 300);
JComboBox box = new JComboBox();
box.addItem("--请选择年龄段--");
box.addItem("0~8岁");
box.addItem("8~12岁");
box.addItem("12~16岁");
box.addItem("16~18岁");
box.addItem("18岁以上");
jf.add(box);
jf.setVisible(true);
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
}
运行结果展示:
更多细致内容在此不展开,可以查阅官方API文档仔细学习:Class JComboBox
1.9 菜单栏组件
菜单栏通常由菜单条(JMenuBar)、菜单(JMenu)、菜单项(JMenuItem)组成,其中菜单项依附于菜单,菜单依附于菜单条。可以由此创建一级菜单或多级菜单。故在创建时,应将菜单项添加至菜单,再将菜单添加至菜单条。
a.JMenuItem的构造方法
构造方法 | 语法 | 功能 |
---|---|---|
无参构造方法 | JMenuItem() | 创建空白菜单项 |
含参构造方法 | JMenuItem(String text) | 创建含文本的菜单项 |
含参构造方法 | JMenuItem(Icon icon) | 创建含图标的菜单项 |
含参构造方法 | JMenuItem(String text, Icon icon) | 创建含图标、文本的菜单项 |
b.JMenuItem的常用方法
方法 | 功能 |
---|---|
void setText(String text) | 设置文本 |
void setIcon(Icon icon) | 设置图标 |
c.JMenu的常用方法
方法 | 功能 |
---|---|
JMenuItem add(JMenuItem menuItem) | 将菜单项添加入菜单 |
void addSeparator() | 添加一个子菜单分割线 |
d.JMenuBar的常用方法
方法 | 功能 |
---|---|
JMenu add(JMenu menu) | 将菜单添加入菜单条 |
e.实例展示
创建一个示例:
import java.awt.*;
import javax.swing.*;
public class JMenuTest {
public static void main(String[] args) {
JFrame jf = new JFrame("这是一个JFrame");
jf.setLayout(new FlowLayout()); // 使用流式布局防止按钮填满整个页面
jf.setSize(400, 250);
jf.setLocation(400, 300);
JMenuBar bar = new JMenuBar();
JMenu menu1 = new JMenu("菜单一");
JMenu menu2 = new JMenu("菜单二");
JMenuItem item1 = new JMenuItem("选项一");
JMenuItem item2 = new JMenuItem("选项二");
JMenuItem item3 = new JMenuItem("选项三");
JMenuItem itema = new JMenuItem("选项a");
JMenuItem itemb = new JMenuItem("选项b");
JMenuItem itemc = new JMenuItem("选项c");
menu1.add(item1);
menu1.add(item2);
menu1.add(item3);
menu2.add(itema);
menu2.add(itemb);
menu2.add(itemc);
bar.add(menu1);
bar.add(menu2);
jf.add(bar);
jf.setVisible(true);
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
}
运行结果展示:
更多细致内容在此不展开,可以查阅官方API文档仔细学习:
(1)菜单条:Class JMenuBar
(2)菜单:Class JMenu
(3)菜单项:Class JMenuItem
1.10 文本框组件
JTextField文本框组件,用来编辑单行的文本。
a.JTextField的构造方法
构造方法 | 语法 | 功能 |
---|---|---|
无参构造方法 | JTextField() | 创建空白文本框 |
含参构造方法 | JTextField(String text) | 创建文本框,指定默认文字 |
含参构造方法 | JTextField(int columns) | 创建文本框,指定文本框长度 |
含参构造方法 | JTextField(String text, int columns) | 创建文本框,指定默认文字和文本框长度 |
b.JTextField的常用方法
方法 | 功能 |
---|---|
void setText(String text) | 设置文本 |
void setFont(Font font) | 设置文本的字体类型、样式和大小 |
void setForeground(Color fg) | 设置字体颜色 |
String getText() | 获取文本框中的文本 |
void setCaretColor(Color c) | 设置光标颜色 |
void setSelectionColor(Color c) | 设置选中部分背景的颜色 |
void setSelectedTextColor(Color c) | 选中部分文本的颜色 |
void setDisabledTextColor(Color c) | 设置不可用时文本的颜色 |
void setEditable(boolean b) | 设置文本框是否可编辑 |
void setEnabled(boolean b) | 设置组件是否可用 |
c.实例展示
创建一个示例:
import java.awt.*;
import javax.swing.*;
public class JTextFieldTest {
public static void main(String[] args) {
JFrame jf = new JFrame("这是一个JFrame");
jf.setLayout(new FlowLayout(FlowLayout.LEFT));
jf.setSize(400, 250);
jf.setLocation(400, 300);
JLabel jl = new JLabel("账号:");
JTextField text = new JTextField("请输入", 30);
jf.add(jl);
jf.add(text);
jf.setVisible(true);
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
}
运行结果展示:
更多细致内容在此不展开,可以查阅官方API文档仔细学习:Class JTextField
1.11 密码框组件
JPasswordField密码框组件继承自JTextField,区别在于显示输入的内容时用特定的符号替换显示,组件的用法和JTextField基本一致,故此处不再详细介绍与JTextField一致的方法,只介绍一些特有方法。
a.JPasswordField特有的常用方法
方法 | 功能 |
---|---|
char[] getPassword() | 获取密码框输入的密码 |
void setEchoChar(char c) | 设置密码框默认显示的密码字符 |
b.实例展示
创建一个示例:
import java.awt.*;
import javax.swing.*;
public class JPasswordFieldTest {
public static void main(String[] args) {
JFrame jf = new JFrame("这是一个JFrame");
jf.setLayout(new FlowLayout(FlowLayout.LEFT));
jf.setSize(400, 250);
jf.setLocation(400, 300);
JLabel jl1 = new JLabel("账号:");
JTextField text = new JTextField("请输入", 30);
jf.add(jl1);
jf.add(text);
JLabel jl2 = new JLabel("密码:");
JPasswordField password = new JPasswordField("114514", 30);
jf.add(jl2);
jf.add(password);
jf.setVisible(true);
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
}
运行结果展示:
更多细致内容在此不展开,可以查阅官方API文档仔细学习:Class JPasswordField
1.12 文本域组件
JTextArea文本域组件用来编辑多行文本,其基本用法和JTextField组件基本一致。
a.JTextArea的构造方法
构造方法 | 语法 | 功能 |
---|---|---|
无参构造方法 | JTextArea() | 创建空白文本域 |
含参构造方法 | JTextArea(String text) | 创建文本域,指定默认文字 |
含参构造方法 | JTextArea(int rows, int columns) | 创建文本域,指定默认文本域长度、宽度 |
含参构造方法 | JTextArea(String text, int rows, int columns) | 创建文本域,指定默认文字和文本域长度、宽度 |
b.JTextArea的常用方法
方法 | 功能 |
---|---|
void setText(String text) | 设置文本 |
void setFont(Font font) | 设置文本的字体类型、样式和大小 |
void setForeground(Color fg) | 设置字体颜色 |
String getText() | 获取文本域中的文本 |
void setLineWrap(boolean wrap) | 设置是否自动换行,默认false |
void append(String str) | 追加文本到文本域末尾 |
void replaceRange(String str, int start, int end) | 替换部分文本 |
void setCaretColor(Color c) | 设置光标颜色 |
void setSelectionColor(Color c) | 设置选中部分背景的颜色 |
void setSelectedTextColor(Color c) | 选中部分文本的颜色 |
void setDisabledTextColor(Color c) | 设置不可用时文本的颜色 |
void setEditable(boolean b) | 设置文本框是否可编辑 |
void setEnabled(boolean b) | 设置组件是否可用 |
c.实例展示
创建一个示例:
import java.awt.*;
import javax.swing.*;
public class JTextAreaTest {
public static void main(String[] args) {
JFrame jf = new JFrame("这是一个JFrame");
jf.setLayout(new FlowLayout(FlowLayout.LEFT));
jf.setSize(400, 250);
jf.setLocation(400, 300);
JLabel jl = new JLabel("请输入你的感受:");
JTextArea area = new JTextArea("我觉得很愉快ヾ(≧▽≦*)o", 30, 35);
jf.add(jl);
jf.add(area);
jf.setVisible(true);
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
}
运行结果展示:
更多细致内容在此不展开,可以查阅官方API文档仔细学习:Class JTextArea
第二部分 布局
为了将Java Swing的各种组件添加到面板容器中(JPanel),需要给面板容器指定布局管理器(LayoutManager),明确各个组件之间的排列布局方式。
本教程将只着重介绍以下三种常用的布局管理器,想要了解其他布局管理器可以参考官方API文档。
布局管理器 | 相关介绍 |
---|---|
FlowLayout | 流式布局,按组件加入的顺序水平方向排列,排满一行换下一行继续排列 |
BorderLayout | 边界布局,把窗口按方位分为5个区域,每个区域放置一个组件 |
2.1 流式布局
按组件加入的顺序水平方向排列,排满一行换下一行继续排列。
a.FlowLayout的构造方法
构造方法 | 语法 | 功能 |
---|---|---|
无参构造方法 | FlowLayout() | 默认居中对齐 |
含参构造方法 | FlowLayout(int align) | 指定对齐方式 |
含参构造方法 | FlowLayout(int align, int hgap, int vgap) | 指定对齐方式,水平、竖直的间隔 |
tip:对齐方式的参考值:
- FlowLayout.LEFT : 左对齐
- FlowLayout.CENTER : 居中对齐(默认)
- FlowLayout.RIGHT : 右对齐
- FlowLayout.LEADING : 与容器方向的开始边对齐
- FlowLayout.TRAILING : 与容器方向的结束边对齐
b.实例展示
创建一个示例:
import java.awt.*;
import javax.swing.*;
public class FlowLayoutTest {
public static void main(String[] args) {
JFrame jf = new JFrame("这是一个JFrame");
jf.setLayout(new FlowLayout(FlowLayout.LEFT));
jf.setSize(250, 250);
jf.setLocation(400, 300);
JPanel jp = new JPanel(new FlowLayout());
JButton btn01 = new JButton("按钮01");
JButton btn02 = new JButton("按钮02");
JButton btn03 = new JButton("按钮03");
JButton btn04 = new JButton("按钮04");
JButton btn05 = new JButton("按钮05");
jp.add(btn01);
jp.add(btn02);
jp.add(btn03);
jp.add(btn04);
jp.add(btn05);
jf.setContentPane(jp);
jf.setVisible(true);
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
}
运行结果展示:
更多细致内容在此不展开,可以查阅官方API文档仔细学习:Class FlowLayout
2.2 边界布局
默认的布局,它把窗口按方位分为东、西、南、北、中五个区域,每个区域放置一个组件。
a.BorderLayout的构造方法
构造方法 | 语法 | 功能 |
---|---|---|
无参构造方法 | BorderLayout() | 构造一个组件之间没有间距的边界布局管理器 |
含参构造方法 | BorderLayout(int hgap, int vgap) | 构造一个边界布局管理器,指定组件之间水平、竖直间距 |
b.BorderLayout的重要常量
- BorderLayout.NORTH:表示容器的北部
- BorderLayout.SOUTH:表示容器的南部
- BorderLayout.WEST:表示容器的西部
- BorderLayout.EAST:表示容器的东部
- BorderLayout.CENTER:表示容器的中部
c.实例展示
创建一个示例:
import java.awt.*;
import javax.swing.*;
public class BorderLayoutTest {
public static void main(String[] args) {
JFrame jf = new JFrame("这是一个JFrame");
jf.setLayout(new FlowLayout(FlowLayout.LEFT));
jf.setSize(250, 250);
jf.setLocation(400, 300);
JPanel jp = new JPanel(new BorderLayout());
JButton btn01 = new JButton("北部");
JButton btn02 = new JButton("南部");
JButton btn03 = new JButton("东部");
JButton btn04 = new JButton("西部");
JButton btn05 = new JButton("中部");
jp.add(btn01, BorderLayout.NORTH);
jp.add(btn02, BorderLayout.SOUTH);
jp.add(btn03, BorderLayout.EAST);
jp.add(btn04, BorderLayout.WEST);
jp.add(btn05, BorderLayout.CENTER);
jf.setContentPane(jp);
jf.setVisible(true);
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
}
运行结果展示:
更多细致内容在此不展开,可以查阅官方API文档仔细学习:Class BorderLayout
2.3 网格布局
网格布局管理器GridLayout以矩形网格形式对组件进行布置,把容器按行列分成大小相等的矩形网格,一个网格中放置一个组件,组件宽高自动撑满网格。容器大小改变,网格大小也改变。
a.GridLayout的构造方法
构造方法 | 语法 | 功能 |
---|---|---|
无参构造方法 | GridLayout() | 每个组件占据一行一列 |
含参构造方法 | GridLayout(int rows, int cols) | 指定行数、列数 |
含参构造方法 | GridLayout(int rows, int cols, int hgap, int vgap) | 指定行数、列数;指定组件之间水平、竖直间距 |
b.实例展示
创建一个示例:
import java.awt.*;
import javax.swing.*;
public class GridLayoutTest {
public static void main(String[] args) {
JFrame jf = new JFrame("这是一个JFrame");
jf.setLayout(new FlowLayout(FlowLayout.LEFT));
jf.setSize(300, 250);
jf.setLocation(400, 300);
JPanel jp = new JPanel(new GridLayout());
JButton btn01 = new JButton("a");
JButton btn02 = new JButton("b");
JButton btn03 = new JButton("c");
JButton btn04 = new JButton("d");
JButton btn05 = new JButton("e");
jp.add(btn01);
jp.add(btn02);
jp.add(btn03);
jp.add(btn04);
jp.add(btn05);
jf.setContentPane(jp);
jf.setVisible(true);
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
}
运行结果展示:
更多细致内容在此不展开,可以查阅官方API文档仔细学习:Class GridLayout
第三部分 监听事件
事件模型表示程序和用户之间的交互,事件处理则是表示程序对事件的响应。事件处理模型能使图形界面接收用户的操作,并作出响应。一个事件模型主要涉及三类对象:
事件:用户对组件的一次操作称为一个事件,以类的形式出现。
事件源:事件发生的场所,通常就是各个组件。
监听器:接收事件对象并对其进行处理的对象事件处理器,通常是某个类中负责处理事件的方法。
使用监听器需要如下步骤:
(1)新建一个组件
(2)将该组件添加至面板组件
(3)注册监听器以监听事件
(4)定义事件处理的方式
3.1两类事件监听器
事件 | 事件源 | 监听接口 | 方法 | |
---|---|---|---|---|
动作事件监听器 | ActionEvent | JButton、JList等组件 | ActionListener | addActionListener()、removeActionListener() |
焦点事件监听器 | FocusEvent | Component及其子类 | FocusListener | addFocusListener()、removeFocusListener() |
3.2 实例展示
创建一个示例:
import java.awt.*;
import java.awt.event.ActionEvent;
import javax.swing.*;
public class EventTest {
public static void main(String[] args) {
JFrame jf = new JFrame("这是一个JFrame");
jf.setLayout(new FlowLayout(FlowLayout.LEFT));
jf.setSize(300, 250);
jf.setLocation(400, 300);
JPanel jp = new JPanel(new FlowLayout());
JButton btn = new JButton("投喂德川");
JTextArea area = new JTextArea(8, 20);
btn.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
area.append("莫亚达,亚达莫亚达;牡蛎,牡蛎莫牡蛎\n");
}
});
jp.add(area);
jp.add(btn);
jf.setContentPane(jp);
jf.setVisible(true);
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
}
运行结果展示:
第四部分 综合实例
如下创建一个餐厅点餐界面的示例:
(1)先创建一个登录界面UI类:
package UI;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class loginUI extends JFrame implements ActionListener {
// 声明变量
JButton btnLogin, btnReset, btnCancel = null; //三个按钮组件对象
JRadioButton radCustomer, radWaiter = null; //两个单选框组件对象
JLabel jlb1, jlb2, jlb3 = null; //三个标签组件对象
JTextField txtUserName = null; //用户名-文本框对象
JPasswordField txtPwd = null; //密码--密码密码框对象
JPanel jp1, jp2, jp3, jp4 = null; //四个容器对象
ButtonGroup bg = null; //按钮组组件
String strMessage = ""; //用来提示信息用的一个变量
//构造函数
public loginUI() {
//按钮
btnLogin = new JButton("Login");
btnCancel = new JButton("Cancel");
btnReset = new JButton("Reset");
//对按钮设置监听
btnLogin.addActionListener(this);
btnCancel.addActionListener(this);
btnReset.addActionListener(this);
//单选按钮组件
radCustomer = new JRadioButton("会员");
radWaiter = new JRadioButton("店员");
bg = new ButtonGroup();
bg.add(radCustomer);
bg.add(radWaiter);
this.radCustomer.setSelected(true);
//提示标签
jlb1 = new JLabel("用户名:");
jlb2 = new JLabel("密 码:");
jlb3 = new JLabel("权 限:");
//文本框
txtUserName = new JTextField(10);
txtPwd = new JPasswordField(10);
//面板组件
jp1 = new JPanel();
jp2 = new JPanel();
jp3 = new JPanel();
jp4 = new JPanel();
//将组件添加至面板容器组件
jp1.add(jlb1);
jp1.add(txtUserName);
jp2.add(jlb2);
jp2.add(txtPwd);
jp3.add(jlb3);
jp3.add(radCustomer);
jp3.add(radWaiter);
jp4.add(btnLogin);
jp4.add(btnCancel);
jp4.add(btnReset);
//将面板容器组件添加到Frame中
this.add(jp1);
this.add(jp2);
this.add(jp3);
this.add(jp4);
//设置布局管理器,4行1列
this.setLayout(new GridLayout(4,1));
this.setTitle("会员制餐厅"); //给窗口设置标题
this.setSize(300,250); //设置窗体大小
this.setLocation(200, 150); //设置窗体初始位置
//设置当关闭窗口时,保证JVM也退出
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//显示窗体
this.setVisible(true);
this.setResizable(true);
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand() == "Cancel") {
System.exit(0);//退出登录
} else if(e.getActionCommand() == "Login") {
//登录 同时检查
if (this.radCustomer.isSelected()) {
new orderUI(this.txtUserName.getText());
} else {
JOptionPane.showConfirmDialog(this, "认真工作,请,三回啊三回");
}
} else if(e.getActionCommand() == "Reset") {
//重置
this.txtUserName.setText(""); //清空用户名
this.txtPwd.setText(""); //清空密码
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new loginUI();
}
}
(2)再创建一个点餐界面UI类:
package UI;
import javax.swing.*;
import java.awt.*;
public class orderUI extends JFrame{
JRadioButton rad1, rad2, rad3 = null; //三个单选框组件对象
JLabel jlb1 = null; //一个标签组件对象
JPanel jp1, jp2 = null; //两个容器对象
ButtonGroup bg = null; //按钮组组件
public orderUI(String s) {
//单选按钮组件
rad1 = new JRadioButton("迎宾酒");
rad2 = new JRadioButton("汉堡肉");
rad3 = new JRadioButton("蔬菜棒");
bg = new ButtonGroup();
bg.add(rad1);
bg.add(rad2);
bg.add(rad3);
this.rad1.setSelected(true);
//提示标签
jlb1 = new JLabel("当前用户:" + s);
//面板组件
jp1 = new JPanel();
jp2 = new JPanel();
//将组件添加至面板容器组件
jp1.add(jlb1);
jp2.add(rad1);
jp2.add(rad2);
jp2.add(rad3);
//将面板容器组件添加到Frame中
this.add(jp1);
this.add(jp2);
//设置布局管理器,4行1列
this.setLayout(new GridLayout(4,1));
this.setTitle("Pizza Service"); //给窗口设置标题
this.setSize(300,250); //设置窗体大小
this.setLocation(200, 150); //设置窗体初始位置
//设置当关闭窗口时,保证JVM也退出
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//显示窗体
this.setVisible(true);
this.setResizable(true);
}
}
结果展示: