第七节 GUI 图形用户界面
1. Swing 概述
Java中针对GUI设计提供了基本图形用户接口开发工具,如AWT、Swing、和JavaFX。其中AWT逐渐被Swing取代
Swing组件继承关系:

Swing组件都继承自Container类,主要有两个分支:容器分支(包括Window窗口和Panel面板)和组件分支。常见顶级容器JApplet、JFrame和JDialog,常用的组件类有按钮组件,和JTextComponent类及其子类。
2. 顶级容器
2.1 JFrame容器
它是一个顶级容器,用来放其他组件和容器的,它不能放在别的容器内。
使用方法如下:
public class JFrameDemo {
public static void main(String[] args) {
//使用SwingUtilities工具类调用createAndShowGUI()方法显示GUI程序
/**
* SwingUtilities里面的invokeLater()方法可以开启一个新的线程来显示窗口
*/
SwingUtilities.invokeLater(JFrameDemo::createAndShowGUI);
}
public static void createAndShowGUI(){
//创建并设置JFrame容器窗口
JFrame frame=new JFrame("JFrame顶级窗口");
//设置关闭窗口时的默认操作
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置窗口尺寸
frame.setSize(250,150);
//展示JFrame容器窗口
frame.setVisible(true);
}
}
2.2 JDialog容器
通常用来表示对话框窗口,可以分为两种:模态和非模态,如果处于模态,我们需要先区处理完这个模态窗口才能继续去和其他窗口进行交互,如果是非模态,那么我们可以继续和其他窗口进行交互。通过setModal(boolean mode)方法可以进行模态和非模态的设置。
创建JDialog的三种构造方法:
| 方法声明 | 功能描述 |
|---|---|
| JDialog(Frame owner) | 构造方法,用来创建一个非模态的对话框,owner为对话框所有者(顶级窗口JFrame) |
| JDialog(Frame owner,String title) | 构造方法,创建一个具有指定标题的非模态对话框 |
| JDialog(Frame owner,boolean modal) | 创建一个有指定模式的无标题对话框 |
使用如下:
public class JDialogDemo {
public static void main(String[] args) {
SwingUtilities.invokeLater(JDialogDemo::createAndShowGUI);
}
private static void createAndShowGUI(){
//创建顶级容器
JFrame jFrame=new JFrame("顶级窗口");
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setSize(340,150);
jFrame.setVisible(true);
JDialog dialog=new JDialog(jFrame,"JDialog对话框");
dialog.setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE);
dialog.setSize(200,100);
dialog.setVisible(true);
}
}
3. 布局管理器
Swing 工具提供了8中布局管理器,分别为BorderLayout(边界布局管理器)、BoxLayout(箱式布局管理器)、CardLayout(卡片布局管理器)、FlowLayout(流式布局管理器)、GridBagLayout(网格包布局管理器)、GridLayout(网格布局管理器)、GroupLayout(分组布局管理器)和SpringLayout(弹性布局管理器)
3.1 BorderLayout(边界布局管理器)
它将容器划分为五个部分,分别是页头(PAGE_START)、页尾(PAGE_END)、行首(LINE_START)、行尾(LINE_END)、中部(CENTER)
使用如下:
public class BorderLayoutDemo {
private static void createAndShowGUI(){
JFrame jframe=new JFrame("顶级窗口");
jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jframe.setSize(300,400);
jframe.setLayout(new BorderLayout());
Button btn1=new Button("PAGE_START");
Button btn2=new Button("PAGE_END");
Button btn3=new Button("LINE_START");
Button btn4=new Button("LINE_END");
Button btn5=new Button("CENTER");
jframe.add(btn1,BorderLayout.PAGE_START);
jframe.add(btn2,BorderLayout.PAGE_END);
jframe.add(btn3,BorderLayout.LINE_START);
jframe.add(btn4,BorderLayout.LINE_END);
jframe.add(btn5,BorderLayout.CENTER);
jframe.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(BorderLayoutDemo::createAndShowGUI);
}
}
效果如下图:

注意:如果添加的时候不指明放到那个区域,那么就会默认放在CENTER区域,如果多个都没指明,后面的会覆盖掉前面的。
3.2 FlowLayout(流式布局管理器)
容器会将组件按照添加顺序从左向右放置,当达到容器的边界时,会自动将组件放到下一行的开始位置。组件可以按照左对齐,居中对齐(默认)或右对齐的方式排列。
FlowLayout构造方法:
| 方法声明 | 功能描述 |
|---|---|
| FlowLayout() | 组件默认居中对齐,水平、垂直间距默认为5个单位 |
| FlowLayout(int align) | 指定组件相对于容器的对齐方式,水平、垂直默认为5个单位 |
| FlowLayout(int align, int hgap,int vgap) | 指定组件的对齐方式和水平、垂直间距 |
对于对齐方式,FlowLayout.LEFT表示左对齐、FlowLayout.CENTER表示居中对齐、FlowLayout.RIGHT表示右对齐。
例如:如下使用
public class FlowLayoutDemo {
private static void createAndShowGUI(){
//创建顶级容器
JFrame jFrame=new JFrame("顶级容器");
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setSize(300,400);
jFrame.setLayout(new FlowLayout(FlowLayout.LEFT,20,30));
jFrame.setLocation(300,200);
jFrame.add(new Button("btn1"));
jFrame.add(new Button("btn2"));
jFrame.add(new Button("btn3"));
jFrame.add(new Button("btn4"));
jFrame.add(new Button("btn5"));
jFrame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(FlowLayoutDemo::createAndShowGUI);
}
}
效果如下:

3.3 GridLayout (网格布局管理器)
使用纵横线将容器分为n行m列大小相等的网格,组件自动占据网格的整个部分,从左到右放置组件。
GridLayout构造方法:
| 方法声明 | 功能描述 |
|---|---|
| GridLayout() | 默认只有一行,每个组件占一列 |
| GridLayout(int rows,int cols) | 指定容器的行数和列数 |
| GridLayout(int rows,int cols,int hgap,intvgap) | 指定容器的行数和列数以及组件之间的水平、垂直间距 |
使用示例如下:
public class GridLayoutDemo {
private static void createAndShowGUI(){
JFrame f=new JFrame("GridLayout");
f.setSize(400,300);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLocation(300,500);
f.setLayout(new GridLayout(3,3));
for (int i=1;i<9;i++){
Button btn=new Button("btn"+i);
f.add(btn);
}
f.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(GridLayoutDemo::createAndShowGUI);
}
}
效果如下图:

4. 事件处理
4.1 事件处理概述
事件处理涉及到的三个要素:
(1)事件源:事件发生的地方。
(2)事件对象:发生了什么事件
(3)监听器:发生了事情之后,怎么做
使用步骤:
(1)创建事件源
(2)给事件源添加监听器。可自定义监听器,这个监听器要实现XxxListener接口(根据组件触发的动作进行区分,如WindowListener用于监听窗口事件,ActionListener用于监听动作事件)
例如:
//自定义监听器
public class MyListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("用户点击了JButton按钮组件");
}
}
public class ListenerDemo {
private static void createAndShowGUI(){
//创建窗口
JFrame f=new JFrame("监听");
f.setSize(300,400);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//1.创建事件源
Button btn1=new Button("按钮");
f.add(btn1);
btn1.addActionListener(new MyListener());
f.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(ListenerDemo::createAndShowGUI);
}
}
4.2 Swing 中常见的事件
Swing 中常见的事件大致可以分为:窗体事件(WindowEvent)、鼠标事件(MouseEvent)、键盘事件(KeyEvent)、动作事件(ActionEvent)等。
4.2.1 窗体事件
可定一个一个窗体事件,但是要实现WindowListener接口,并实现相关方法。
具体使用如下:
public class WindowListenDemo {
private static void createAndShowGUI(){
//创建顶级窗口
JFrame f=new JFrame("WindowListener");
f.setSize(400,500);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLocation(500,400);
//通过匿名内部类
f.addWindowListener(new WindowListener() {
@Override
public void windowOpened(WindowEvent e) {
System.out.println("windowOpened---窗体打开事件");
}
@Override
public void windowClosing(WindowEvent e) {
System.out.println("windowCloseing----窗体正在关闭事件");
}
@Override
public void windowClosed(WindowEvent e) {
System.out.println("windowClosed---窗体关闭事件");
}
@Override
public void windowIconified(WindowEvent e) {
System.out.println("windowIconified---窗体图标化事件");
}
@Override
public void windowDeiconified(WindowEvent e) {
System.out.println("windowDeiconified---窗体取消图标化事件");
}
@Override
public void windowActivated(WindowEvent e) {
System.out.println("windowActivated---窗体激活事件");
}
@Override
public void windowDeactivated(WindowEvent e) {
System.out.println("windowDeactiveted---窗体停用事件");
}
});
f.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(WindowListenDemo::createAndShowGUI);
}
}
效果如下图:

4.2.2 鼠标事件
MouseEvent这个类是Java提供用来表示鼠标事件,几乎所有组件都可以产生鼠标事件。我们自定义的鼠标监听器要去实现MouseListener。也可通过继承适配器MouseAdapter类实现。
使用如下:
public class MouseEventDemo {
private static void createAndShowGUI(){
JFrame f=new JFrame("MouseEvent");
f.setSize(400,300);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLocation(400,300);
Button btn1=new Button("鼠标按钮事件");
f.add(btn1);
btn1.addMouseListener(new MouseListener() {
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("鼠标单击事件");
}
@Override
public void mousePressed(MouseEvent e) {
System.out.println("鼠标按下事件");
}
@Override
public void mouseReleased(MouseEvent e) {
System.out.println("鼠标释放事件");
}
@Override
public void mouseEntered(MouseEvent e) {
System.out.println("鼠标进入按钮事件");
}
@Override
public void mouseExited(MouseEvent e) {
System.out.println("鼠标移出按钮区域事件");
}
});
f.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(MouseEventDemo::createAndShowGUI);
}
}
效果如下图:

在鼠标事件中,MouseEvent 类中定义了很多的常量来识别鼠标动作。
比如如下代码:
public class MouseDemo {
private static void createAndShowGUI(){
JFrame f=new JFrame("Mouse");
f.setSize(400,300);
f.setLocation(400,300);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Button btn1=new Button("鼠标动作");
f.add(btn1);
btn1.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if(e.getButton()==MouseEvent.BUTTON1){
System.out.println("鼠标左键单击事件");
}
if(e.getButton()==MouseEvent.BUTTON2){
System.out.println("鼠标中键单击事件");
}
if(e.getButton()==MouseEvent.BUTTON3){
System.out.println("鼠标右键单击事件");
}
}
});
f.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(MouseDemo::createAndShowGUI);
}
}
效果如图:

4.2.3 键盘事件
Java中提供的KeyEvent类表示键盘事件,如果我们要自定义键盘事件,那么我要去实现KeyListener接口或者继承KeyAdapter类,然后调用addKeyListener()方法将监听器绑定到事件源对象。
使用如下:
public class KeyEventDemo {
private static void createAndShowGUI(){
JFrame f=new JFrame("KeyEvent");
f.setSize(400,300);
f.setLocation(400,300);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JTextField tf=new JTextField(30);
f.add(tf);
tf.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e){
//获取对应的键盘字符
char keyChar=e.getKeyChar();
//获取对应的键盘字符代码
int keyCode=e.getKeyCode();
System.out.print("键盘按下的字符内容为:"+keyChar+"");
System.out.println("键盘按下的字符代码为:"+keyCode);
}
});
f.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(KeyEventDemo::createAndShowGUI);
}
}
效果如下图:

4.2.4 动作组件
它不代表某类事件,只是表示一个动作发生了。例如关闭一个文件时,可以通过键盘关闭,也可通过鼠标关闭,这里不关心是哪种方式关闭,只要是对关闭按钮进行操作,就触发事件。
在Java中,动作事件用ActionEvent类表示,如果我们要自定义动作事件,那么我们要实现ActionListener接口。
5. Swing 常用组件
5.1 面板组件
5.1.1 JPanel
JPanel面板组件是一个无边框,不能被移动、放大、缩小或者关闭的面板,默认布局是FlowLayout。通过构造函数JPanel(LayoutManager layout)或它的setLayout()方法进行设置布局管理器。
它的大多数方法都是从Container继承过来的。
5.1.2 JScrollPane
它是一个带有滚动条的面板容器,并且这个面板只能添加一个组件,如果想向它中添加多个组件,应该先将多个组件添加到某个组件中,然后再去添加到JScrollPane中。
JScrollPane常用构造方法:
| 方法声明 | 功能描述 |
|---|---|
| JScrollPane() | 创建一个空的JScrollPane面板 |
| JScrollPane(Component view) | 创建一个显示指定组件的JScrollPane面板,只要组件内容超过视图大小就会显示水平和垂直滚动条 |
| JScrollPane(Component view,int vsbPolicy,int hsbPolicy) | 创建一个显示指定容器,并具有指定滚动条策略。 |
JScrollPane设置面板滚动策略方法:
(1)通过构造方法进行设置
(2)通过下面的几个方法进行设置
| 方法声明 | 功能描述 |
|---|---|
| void setHorizontalBarPolicy(int policy) | 设置水平滚动条策略 |
| void setVerticalBarPolicy(int policy) | 设置垂直滚动条策略 |
| void setViewportView(Component view) | 设置在滚动面板显示的组件 |
通过ScrollPaneConstants接口中的常量进行设置滚动策略:
| 常量属性 | 功能描述 |
|---|---|
| VERTICAL_SCROLLBAR_AS_NEEDED ,HORIZONTAL_SCROLLBAR_AS_NEEDED | 当填充的组件超过客户端窗口时显示滚动条 |
| VERTICAL_SCROLLBAR_ALWAYS, HORIZONTAL_SCROLLBAR_ALWAYS | 无论组件是否超过窗口都显示滚动条 |
| VERTICAL_SCROLLBAR_NEVER,HORIZONTAL_SCROLLBAR_NEVER | 无论组件多大都不显示滚动条 |
5.2 文本组件
主要包括两个文本框(JTextField)和文本域(JTextArea),它们都继承与JTextComponent这个抽象类。
JTextComponent常用方法:
| 方法声明 | 功能描述 |
|---|---|
| String getText() | 返回文本组件中所有的文本内容 |
| String getSelectedText() | 返回文本组件中选定的文本内容 |
| void selectAll() | 在文本组件中选中所有内容 |
| void setEditable() | 设置文本组件为可编辑或不可编辑状态 |
| void setText(String text) | 设置文本组件的内容 |
| void replaceSelection(String content) | 用给定内容替换当前选定的内容 |
5.2.1 JTextField
只接收单行文本的输入
JTextField常用构造方法
| 方法声明 | 功能描述 |
|---|---|
| JTextField() | 创建一个空的文本框字符串初始为null |
| JTextField(int columns) | 创建一个具有指定列数的文本框,字符串初始为null |
| JTextField(String text) | 创建一个指定初始字符串的文本框 |
| JTextField(String text,int columns) | 创建一个指定列数和初始化字符串的文本框 |
JPasswordField是JTextField的子类,构造方法与JTextField类似,他是密码框。
5.2.2 JTextArea
他们接收多行文本的输入。
常用构造方法:
| 方法声明 | 功能描述 |
|---|---|
| JTextArea() | 创建一个空的文本域 |
| JTextArea(String text) | 创建一个有初始字符串的文本域 |
| JTextArea(int rows,int columns) | 创建一个具有指定行数和列数的文本域 |
| JTextArea(String text,int rows,int columns) | 创建指定行数和列数并具有初始化字符的文本域 |
小案例:
public class JTextDemo {
private static void createAndShowGUI(){
JFrame f=new JFrame("JText");
f.setSize(400,300);
f.setLocation(300,200);
f.setLayout(new BorderLayout());
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JTextArea jta=new JTextArea(12,34);
JScrollPane jsp=new JScrollPane(jta);
JPanel jp=new JPanel();
JLabel jl=new JLabel("聊天信息:");
jp.add(jl);
JTextField jtf=new JTextField(20);
jp.add(jtf);
Button btn=new Button("发送");
jp.add(btn);
f.add(jsp,BorderLayout.PAGE_START);
f.add(jp,BorderLayout.PAGE_END);
btn.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
String content=jtf.getText();
if(content!=null&&!content.trim().equals("")){
jta.append("本人输入信息:"+content+"\n");
}else{
jta.append("聊天信息不能为空!!!"+"\n");
}
jtf.setText("");
}
});
f.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(JTextDemo::createAndShowGUI);
}
}
效果如下图:

5.3 标签组件 JLabel
它可以显示文本、图像、还可以设置标签内容的垂直和水平对齐方式。
JLabel 的构造方法
| 方法声明 | 功能描述 |
|---|---|
| JLabel() | 创建无图像并且其标题为空字符串的JLabel |
| JLabel(Icon image) | 创建具有图像的JLabel |
| JLabel(Icon image,int horizontalAlignment) | 创建具有指定图像和水平对齐方式的JLabel实例 |
| JLabel(String text) | 创建具有指定文本的JLabel实例 |
| JLabel(String text,Icon icon,int horizontalAlignment) | 创建具有指定文本、图像和对齐方式的JLabel实例 |
| JLabel(String text,int horizontalAlignment) | 创建具有指定文本和水平对齐方式的JLabel实例 |
小案例:
public class JLabelDemo {
private static void createAndShowGUI(){
//创建窗口容器
JFrame jf=new JFrame("JLable");
jf.setSize(300,200);
jf.setLocation(300,200);
jf.setLayout(new BorderLayout());
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//创建JLabel标签来展示图片
JLabel jl=new JLabel();
//创建一个ImageIcon图标组件,并加入JLabel中
ImageIcon icon=new ImageIcon("bg1.jpg");
Image img=icon.getImage();
//设置图片大小
img=img.getScaledInstance(300,150,Image.SCALE_DEFAULT);
icon.setImage(img);
jl.setIcon(icon);
//创建JPanel面板
JPanel panel=new JPanel();
JLabel label=new JLabel("绿茵好乘凉",JLabel.CENTER);
panel.add(label);
jf.add(jl,BorderLayout.PAGE_START);
jf.add(panel,BorderLayout.PAGE_END);
jf.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(JLabelDemo::createAndShowGUI);
}
}

5.4 按钮组件
常见的按钮组件有:JButton、JCheckBox、JRadioButton等,它们都是抽象类AbstractButton的直接或间接子类。
AbstractButton常用方法:
| 方法声明 | 功能描述 |
|---|---|
| Icon getIcon() | 获取按钮的图标 |
| void setIcon(Icon icon) | 设置按钮的图标 |
| String getText() | 获取按钮的文本 |
| void setText(String text) | 设置按钮的文本 |
| void setEnable(boolean b) | 设置按钮是否可用 |
| boolean setSelected(boolean b) | 设置按钮是否为选中状态 |
| boolean isSelected() | 返回按钮的状态 |
5.4.1 JCheckBox(复选框)
JCheckBox 常用构造方法:
| 方法声明 | 功能描述 |
|---|---|
| JCheckBox() | 创建一个没有文本信息,初始状态未被选中的复选框 |
| JCheckBox(String text) | 创建一个带有文本信息,初始状态未被选定的复选框 |
| JCheckBox(String text,boolean selected) | 创建一个带有文本信息,并指定初始状态的复选框 |
其中第一个构造方法我们可以利用setText()方法设置文本,利用setSelected()方法设置是否被选中利用isSelected()判断是否被选中
小案例:
public class CheckBoxDemo {
private static void createAndShowGUI(){
//创建容器窗口
JFrame f=new JFrame("CheckBox");
f.setLayout(new BorderLayout());
f.setSize(300,300);
f.setLocation(300,200);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 创建JLabel标签组件,标签文本居中对齐
JLabel label=new JLabel("Hello World",JLabel.CENTER);
label.setFont(new Font("宋体",Font.PLAIN,20));
//创建一个JPanel
JPanel panel=new JPanel();
// 创建两个复选框
JCheckBox italic=new JCheckBox("ITALIC");
JCheckBox bold=new JCheckBox("BOLD");
// 给复选框添加监听器
ActionListener listener=new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int mode=0;
if(bold.isSelected()){
mode+=Font.BOLD;
}
if(italic.isSelected()){
mode+=Font.ITALIC;
}
label.setFont(new Font("宋体",mode,20));
}
};
// 为复选框添加监听
italic.addActionListener(listener);
bold.addActionListener(listener);
panel.add(italic);
panel.add(bold);
f.add(label);
f.add(panel,BorderLayout.PAGE_END);
f.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(CheckBoxDemo::createAndShowGUI);
}
}
效果如下:

5.4.2 JRadioButton(单选框)
实现单选框,需要使用javax.swing.ButtonGroup类,它是一个不可见的组件,只是逻辑上被添加到同一个ButtonGroup对象中的单选按钮才会互斥。
JRadioButton常用构造方法:
| 方法声明 | 功能描述 |
|---|---|
| JRadioButton() | 创建一个没有文本信息,初始状态没有被选中的单选框 |
| JRadioButton(String text) | 创建一个带有文本信息,初始状态未被选中的单选框 |
| JRadioButton(String text,boolean selected) | 创建要给具有文本信息,并指定初始化状态的单选框 |
public class JRadioButtonDemo {
private static void createAndShowGUI(){
//创建容器窗口
JFrame f=new JFrame("JRadioButton");
f.setLayout(new BorderLayout());
f.setSize(300,300);
f.setLocation(300,200);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 创建JLabel标签组件,标签文本居中对齐
JLabel label=new JLabel("Hello World",JLabel.CENTER);
label.setFont(new Font("宋体",Font.PLAIN,20));
//创建一个JPanel
JPanel panel=new JPanel();
ButtonGroup group=new ButtonGroup();
// 创建两个复选框
JRadioButton italic=new JRadioButton("ITALIC");
JRadioButton bold=new JRadioButton("BOLD");
group.add(italic);
group.add(bold);
// 给复选框添加监听器
ActionListener listener=new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int mode=0;
if(bold.isSelected()){
mode+=Font.BOLD;
}
if(italic.isSelected()){
mode+=Font.ITALIC;
}
label.setFont(new Font("宋体",mode,20));
}
};
// 为复选框添加监听
italic.addActionListener(listener);
bold.addActionListener(listener);
panel.add(italic);
panel.add(bold);
f.add(label);
f.add(panel,BorderLayout.PAGE_END);
f.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(JRadioButtonDemo::createAndShowGUI);
}
}
效果如下图:

5.5 下拉框组件 JComboBox
JComboBox组件,默认显示的是第一个添加选项
JComboBox下拉组件分为可编辑和不可编辑两种。可编辑用户可以自己编辑作为当前显示项,但是不会加入到下拉框列表中。
JComboBox常用构造方法:
| 方法声明 | 功能描述 |
|---|---|
| JComboBox() | 创建一个没有可选项的下拉框 |
| JComboBox(Object[ ] items) | 创建一个下拉框,将Object数组中的元素作为下拉框的下拉列表选项 |
| JComboBox(Vector items) | 创建一个下拉框,将Vetor集合中的元素作为下来拉框的下拉列表选项 |
JComboBox的常用方法
| 方法声明 | 功能描述 |
|---|---|
| void addItem(Object anObject) | 为下拉框添加选项 |
| void inertItemAt(Object anObject,int index) | 在指定索引处插入选项 |
| Object getItemAt(int index) | 返回指定索引处的选项,第一个选项索引为0 |
| int getItemCount() | 返回下拉框中选项的数目 |
| Object getSelectedItem() | 返回当前所选项 |
| void removeAllItems() | 删除下拉框中的所有选项 |
| void removeItem(Object object) | 从下拉框中删除指定选项 |
| void removeItemAt(int index) | 删除指定索引处的选项 |
| void setEditable(boolean aFlag) | 设置下拉框的选项是否可编辑 |
使用如下:
public class JComboBoxDemo {
private static void createAndShowGUI(){
//创建一个容器
JFrame f=new JFrame("JComboBox");
f.setSize(350,200);
f.setLocation(300,200);
f.setLayout(new BorderLayout());
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//创建JComboBox
JComboBox<String> comboBox=new JComboBox<>();
//创建panel
JPanel panel=new JPanel();
comboBox.addItem("请选择城市");
comboBox.addItem("北京");
comboBox.addItem("天津");
comboBox.addItem("南京");
comboBox.addItem("上海");
//创建JTextField
JTextField textField=new JTextField(20);
comboBox.addActionListener(e->{
String item=(String)comboBox.getSelectedItem();
if("请选择城市".equals(item)){
textField.setText("");
}else{
textField.setText("您选择的城市是:"+item);
}
});
panel.add(comboBox);
panel.add(textField);
f.add(panel,BorderLayout.PAGE_START);
f.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(JComboBoxDemo::createAndShowGUI);
}
}
效果如下图:

5.6 菜单组件
5.6.1 下拉式菜单
创建下拉式菜单需要使用三个组件:JMenuBar(菜单栏)、JMenu(菜单)和JMenuItem(菜单项)
(1)JMenuBar,它是一个水平菜单栏,它用来管理一组菜单,可以放容器任何位置,但是一般都是使用顶级容器的setJMenuBar()方法将它放在顶级容器的顶部,有一个无参构造方法,只需new来创建即可,然后调用它的add(JMenu c)方法为其添加菜单
(2)JMenu:它用来整合管理菜单项,菜单可以是单一层次的结构,也可以是多层次的结构。大多数情况下,会使用JMenu(String text)构造函数创建JMenu菜单。
JMenu 常用方法:
| 方法声明 | 功能描述 |
|---|---|
| JMenuItem add(JMenuItem menuItem) | 将菜单项添加到菜单末尾,返回此菜单项 |
| void addSeparator() | 将分隔符添加到菜单的末尾 |
| JMenuItem getItem(int pos) | 返回索引处的菜单项,第一个菜单项的索引为0 |
| int getItemCount() | 返回菜单上的项数,菜单项和分隔符都在计算在内 |
| JMenuItem insert(JMenuItem menuItem,int pos) | 在指定索引处插入菜单项 |
| void insertSeparator(int pos) | 在指定索引处插入分隔符 |
| void remove(int pos) | 从菜单中移除指定索引处的菜单项 |
| void remove(JMenuItem menuitem) | 从菜单中移除指定的菜单项 |
| void removeAll() | 从菜单中移除所有的菜单项 |
(3)JMenuItem:表示菜单项,在创建时一般都是使用JMenuItem(String text)来构造。JMenuItem继承自AbstractButton,因此可以调用AbstractButton类中的setText(String text)和setIcon()方法为其设置文本和图标
5.6.2 弹出式菜单 JPopupMenu
它和下拉菜单一样都是通过add()方法来添加菜单项(JMenuItem),但是它默认是不可见的,如果要显示就要调用它的show(Component invoker,int x int y)方法,invoker表示弹出菜单显示位置的参考组件,x和y表示在参考组件的位置。
示例:
public class JPopupMenuDemo {
private static void createAndShowGUI(){
JFrame f=new JFrame("JPopupMenu");
f.setSize(300,200);
f.setLocation(300,200);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//创建弹出式菜单
JPopupMenu jPopupMenu=new JPopupMenu();
//创建两个菜单项
JMenuItem item1=new JMenuItem("查看");
JMenuItem item2=new JMenuItem("刷新");
jPopupMenu.add(item1);
jPopupMenu.addSeparator();
jPopupMenu.add(item2);
//给顶级容器添加事件
f.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if(e.getButton()==MouseEvent.BUTTON3){
jPopupMenu.show(e.getComponent(),e.getX(),e.getY());
}
}
});
f.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(JPopupMenuDemo::createAndShowGUI);
}
}
6. JavaFX 图形用户界面工具
使用IDEA创建第一个JavaFX项目
第一步:下载可视化工具JavaFX Scene Builder 2.0
下载地址:https://www.oracle.com/java/technologies/javafxscenebuilder-1x-archive-downloads.html
下载完毕后进行安装
打开IDEA:

注意:尽量用JDK 8.

创建完之后:

到这里我们的JavaFX就算配置完成了。
接下来我们利用图形可视化界面创建第一个JavaFX项目
打开可视化工具:


到此第一个JavaFX就算完成了。
后面我们来说一下JavaFX里面的几个文件
(1)Main.java:这个是入口,里面有一个start()方法是用来显示我们的图形用户界面的
(2)Controller.java:这个类是用来写事件处理的
(3)sample.fxml:这个文件是专门用来写样式和图形组件的
利用Eclipse和IDEA进行开发JavaFx在进行配置的时候有些不一样,可以优快云一波。
JavaFX 比Swing用起来更加的方便,设计起来也更加的灵活。
50



被折叠的 条评论
为什么被折叠?



