基于Java Swing界面编程教学

基于Java Swing界面编程

Swing是Java基础类的一部分,是一个为Java设计的GUI工具包。
Swing包含了诸多图形用户界面(GUI)器件,提供了许多比awt更好的屏幕显示元素。
本教程将全面简要介绍Java Swing开发的相关知识,帮助读者快速入门。


文章目录


第一部分 组件

1.1 Java Swing组件之间的继承关系

一个 Java的图形界面,是由各种不同类型的“元素”(诸如窗口、菜单栏、对话框、标签、按钮、文本框等)所组成的,它们被统一称之为组件(Component)。他们之间的继承关系如下图所示:

Java Swing组件

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 其他面板组件

还有许多面板组件如下:

组件概述
1JSplitPane分隔面板
2JTabbedPane选项卡面板
3JLayeredPane层级面板
4JMenuBar菜单栏
5JToolBar工具栏
6JPopupMenu弹出菜单
7JInternalFrame内部弹窗

在此不做详细介绍,如有需要可以详细查阅官方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两类事件监听器

事件事件源监听接口方法
动作事件监听器ActionEventJButton、JList等组件ActionListeneraddActionListener()、removeActionListener()
焦点事件监听器FocusEventComponent及其子类FocusListeneraddFocusListener()、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);	   
	}
}

结果展示:
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值