今天我们来学习一下Java Swing。Swing 是一个为Java设计的GUI工具包,它可以帮助我们创建图形化应用程序,而不是之前的控制台(Dos黑窗口)程序。这里大家需要明白的是,目前已经很少人使用Java Swing来创建图形化应用程序,原因在于B/S架构的应用程序已经逐渐取代了图形化桌面程序了,而且Java Swing相对于微软windows平台下的图形化开发还是弱了一些。最重要的是,就连Java本身也在边缘化Swing。但是,不管怎样,Java Swing开发一个简单的图形化界面还是非常简单的,而且对于图形化编程的很多理论知识,都是相同的。如果我们进一步学习安卓APP开发,或者微软. NET Framework下的图形库Windows.Forms的话,大家就会感觉到今天的内容学习还是非常有意义的。
一个Java的图形界面,由各种不同类型的组件(Component)构成,例如: 窗口、菜单栏、对话框、标签、按钮、文本框等等。这些组件按照不同的功能,可分为窗体组件、容器组件、基本组件。一个图形界面至少需要一个窗体,例如JFrame类代表一个窗体,JDialog代表一个对话框,两者都属于窗体组件。接下来,我们就演示一个JFrame类的使用,代码如下:
// 创建一个窗体
JFrame frame = new JFrame("窗体标题");
// 设置窗体大小
frame.setSize(400, 300);
// 把窗体位置设置到屏幕中心
frame.setLocationRelativeTo(null);
// 当点击窗体的关闭按钮时退出程序
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
// 显示窗体
frame.setVisible(true);
运行该程序后的效果如下:
有了窗体之后,还需要在窗体上面添加各种各样的交互组件,比如显示文字的标签,输入文字的文本框,以及点击用的按钮等等,这些都属于基本组件。请注意,这些基本组件不能直接放置到窗体上面,必须放置到容器组件中才行。容器组件充当基本组件的载体,它可以添加若干基本组件,对其内部的组件进行管理。常用的容器组件包括:JPanel 代表一个面板组件,JScrollPane代表可以水平和垂直滚动的面板组件,JTabbedPane代表选项卡形式的面板组件等等。当然还有其他布局组件,例如:JMenuBar代表一个菜单栏组件,JToolBar代表一个工具栏组件等等。接下来,我们简单演示一下JPanel容器组件的使用,代码如下:
// 创建一个窗体
JFrame frame = new JFrame("窗体标题");
// 设置窗体大小
frame.setSize(400, 300);
// 把窗体位置设置到屏幕中心
frame.setLocationRelativeTo(null);
// 当点击窗体的关闭按钮时退出程序
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
// 创建面板(容器组件)
JPanel panel = new JPanel();
// 创建一个按钮(基本组件),并添加到面板中
JButton btn = new JButton("按钮");
panel.add(btn);
// 窗体添加面板
frame.setContentPane(panel);
// 显示窗体
frame.setVisible(true);
在上面的代码中,我们创建了一个容器组件JPanel面板,然后把一个按钮添加到面板中,左后将面板放置到窗体中,运行后的效果如下:
当把各种基本组件添加到容器组件中,就需要给容器组件指定布局管理器(LayoutManager),明确容器(Container)内的各个组件之间的排列布局方式。以下是常用的布局管理器:
FlowLayout(流式布局管理器)是 JPanel 和 JApplet 的默认布局管理器。FlowLayout 会将组件按照从上到下、从左到右的放置规律逐行进行定位。
FlowLayout 布局管理器的构造方法如下。
FlowLayout():创建一个布局管理器,使用默认的居中对齐方式和默认 5 像素的水平和垂直间隔。
FlowLayout(int align):创建一个布局管理器,使用默认 5 像素的水平和垂直间隔。其中,align 表示组件的对齐方式,对齐的值必须是 FlowLayoutLEFT、FlowLayout.RIGHT 和 FlowLayout.CENTER,指定组件在这一行的位置是居左对齐、居右对齐或居中对齐。
FlowLayout(int align, int hgap, int vgap):创建一个布局管理器,其中 align 表示组件的对齐方式;hgap 表示组件之间的横向间隔;vgap 表示组件之间的纵向间隔,单位是像素。
接下来,我们将之前的代码做调整,如下:
// 创建面板(容器组件)
JPanel panel = new JPanel();
// 创建一个按钮(基本组件),并添加到面板中
JButton btn1 = new JButton("按钮1");
panel.add(btn1);
JButton btn2 = new JButton("按钮2");
panel.add(btn2);
JButton btn3 = new JButton("按钮3");
panel.add(btn3);
JButton btn4 = new JButton("按钮4");
panel.add(btn4);
JButton btn5 = new JButton("按钮5");
panel.add(btn5);
JButton btn6 = new JButton("按钮6");
panel.add(btn6);
JButton btn7 = new JButton("按钮7");
panel.add(btn7);
JButton btn8 = new JButton("按钮8");
panel.add(btn8);
// 向JPanel添加FlowLayout布局管理器,将组件间的横向和纵向间隙都设置为10像素
panel.setLayout(new FlowLayout(FlowLayout.LEADING, 10, 10));
此时这些按钮将在容器上按照从上到下、从左到右的顺序排列,如果一行剩余空间不足容纳组件将会换行显示,最终运行结果如下图所示。
BorderLayout(边框布局管理器)是 Window、JFrame 和 JDialog 的默认布局管理器。边框布局管理器将窗口分为 5 个区域:North(北)、South(南)、East(西)、West(东)和Center(中)。如下图所示:
提示:边框布局管理器并不要求所有区域都必须有组件,如果四周的区域(North、South、East 和 West 区域)没有组件,则由 Center 区域去补充。如果单个区域中添加的不只一个组件,那么后来添加的组件将覆盖原来的组件,所以,区域中只显示最后添加的一个组件。
BorderLayout 布局管理器的构造方法如下所示。
BorderLayout():创建一个 Border 布局,组件之间没有间隙。
BorderLayout(int hgap, int vgap):创建一个 Border 布局,其中 hgap 表示组件之间的横向间隔;vgap 表示组件之间的纵向间隔,单位是像素。
我们重新调整代码,如下:
// 创建面板(容器组件)
JPanel panel = new JPanel();
// 创建一个按钮(基本组件),并添加到面板中
JButton btn1 = new JButton("上北");
JButton btn2 = new JButton("下南");
JButton btn3 = new JButton("左西");
JButton btn4 = new JButton("右东");
JButton btn5 = new JButton("中间");
// 向JPanel添加BorderLayout布局管理器,将组件间的横向和纵向间隙都设置为10像素
panel.setLayout(new BorderLayout(10, 10));
// 添加五个方向的组件
panel.add(btn1,BorderLayout.NORTH);
panel.add(btn2,BorderLayout.SOUTH);
panel.add(btn3,BorderLayout.WEST);
panel.add(btn4,BorderLayout.EAST);
panel.add(btn5,BorderLayout.CENTER);
在该程序中分别指定了 BorderLayout 布局的东、南、西、北、中间区域中要填充的按钮。该程序的运行结果如下图所示:
GridLayout(网格布局管理器),它以矩形网格形式对容器的组件进行布置,把容器按行列分成大小相等的矩形网格,一个网格中放置一个组件,组件宽高自动填充满网格。
GridLayout构造方法:
// 默认构造, 每个组件占据一行一列
GridLayout()
// 指定 行数 和 列数 的网格布局
GridLayout(int rows, int cols)
// 指定 行数 和 列数 的网格布局, 并指定 水平 和 竖直 网格间隙
GridLayout(int rows, int cols, int hgap, int vgap)
// 创建面板(容器组件)
JPanel panel = new JPanel();
// 创建2行3列的网格,将组件间的横向和纵向间隙都设置为10像素
panel.setLayout(new GridLayout(2, 3, 10, 10));
// 创建一个按钮(基本组件),并添加到面板中
JButton btn1 = new JButton("按钮1");
panel.add(btn1);
JButton btn2 = new JButton("按钮2");
panel.add(btn2);
JButton btn3 = new JButton("按钮3");
panel.add(btn3);
JButton btn4 = new JButton("按钮4");
panel.add(btn4);
JButton btn5 = new JButton("按钮5");
panel.add(btn5);
JButton btn6 = new JButton("按钮6");
panel.add(btn6);
// 窗体添加面板
frame.setContentPane(panel);
上面的代码创建了一个2行3列的网格布局,间距为10像素,并且组件会填满每一个子网格,运行效果如下:
JScrollPane,滚动面板。JScrollPane 支持水平和垂直滚动视图。文本区域、表格等需要显示较多数据而空间又有限时,通常使用 JScrollPane 进行包裹以实现滚动显示。
JScrollPane 内包含一个视口(ViewPort),表示 JScrollPane 的显示区域。视口内包含一个需要滚动显示的组件,称为视图。
JScrollPane 常用构造方法:
JScrollPane()
JScrollPane(Component view)
JScrollPane(Component view, int vsbPolicy, int hsbPolicy)
JScrollPane(int vsbPolicy, int hsbPolicy)
滚动条的显示策略的取值:
ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED // 需要时显示(默认)
ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER // 从不显示
ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS // 总是显示
水平滚动条(hsbPolicy)
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED // 需要时显示(默认)
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER // 从不显示
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS // 总是显示
JScrollPane 常用方法:
// 设置滚动显示视图内容组件
void setViewportView(Component view)
// 设置垂直滚动条的显示策略
void setVerticalScrollBarPolicy(int policy)
// 设置水平滚动条的显示策略
void setHorizontalScrollBarPolicy(int policy)
// 是否响应鼠标滚动事件,默认响应
void setWheelScrollingEnabled(boolean handleWheel)
// 创建文本区域组件
JTextArea textArea = new JTextArea();
textArea.setLineWrap(true); // 自动换行
textArea.setFont(new Font(null, Font.PLAIN, 14)); // 设置字体
// 创建滚动面板, 指定滚动显示的视图组件(textArea), 垂直滚动条一直显示, 水平滚动条从不显示
JScrollPane scrollPane = new JScrollPane(
textArea,
ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER
);
// 窗体添加面板
frame.setContentPane(scrollPane);
运行代码,效果如下:
接下来,我们介绍一些常用的基本组件,
1 JLabel 标签
2 JButton 按钮
3 JRadioButton 单选按钮
4 JCheckBox 复选框
5 JToggleButton 开关按钮
6 JTextField 文本框
7 JPasswordField 密码框
8 JTextArea 文本区域
9 JComboBox 下拉列表框
10 JList 列表
11 JProgressBar 进度条
12 JSlider 滑块
13 JFileChooser 文件选取器
14 JColorChooser 颜色选取器
15 JTable 表格
16 JTree 树
JLabel标签主要用于展示文本或图片,也可以同时显示文本和图片。
JLabel 的构造方法:
JLabel()
JLabel(String text)
JLabel(String text, int horizontalAlignment)
JLabel(Icon image)
JLabel(Icon image, int horizontalAlignment)
JLabel(String text, Icon image, int horizontalAlignment)
其中,horizontalAlignment: 标签内容(在标签内)的水平对其方式。
JLabel 的常用方法:
// 设置 文本 和 图片
void setText(String text)
void setIcon(Icon icon)
// 设置文本相对于图片的位置(文本默认在图片右边垂直居中)
void setHorizontalTextPosition(int textPosition)
void setVerticalTextPosition(int textPosition)
// 设置标签内容(在标签内)的对其方式(默认左对齐并垂直居中)
void setHorizontalAlignment(int alignment)
void setVerticalAlignment(int alignment)
// 设置图片和文本之间的间隙
void setIconTextGap(int iconTextGap)
//下面的方法定义在 JComponent 基类中
// 设置文本的字体类型、样式 和 大小
void setFont(Font font)
// 设置字体颜色
void setForeground(Color fg)
// 当鼠标移动到组件上时显示的提示文本
void setToolTipText(String text)
// 设置组件的背景
void setBackground(Color bg)
ImageIcon 的构造方法:
// 使用 本地路径 图片创建 ImageIcon
ImageIcon(String filename)
// 使用 网络路径 图片创建 ImageIcon
ImageIcon(URL location)
// 使用图片文件的字节数组创建 ImageIcon
ImageIcon(byte[] imageData)
// 使用 java.awt.Image 实例创建 ImageIcon
ImageIcon(java.awt.Image image)
// 创建面板(容器组件)
JPanel panel = new JPanel();
// 创建一个文本标签
JLabel label = new JLabel();
label.setText("文本标签");
// 设置字体,null 表示使用默认字体,Font.PLAIN正常样式,14号大小
label.setFont(new Font(null, Font.PLAIN, 14));
panel.add(label);
// 创建一个图片标签
JLabel label2 = new JLabel();
label2.setIcon(new ImageIcon("java.jpg"));
panel.add(label2);
// 窗体添加面板
frame.setContentPane(panel);
运行代码效果如下:
请注意,图片放在项目根目录下(F:\workspace\Hello)。
JButton,按钮。
JButton 常用构造方法:
// 创建不带有设置文本或图标的按钮
JButton()
// 创建一个带文本的按钮
JButton(String text)
// 创建一个带图标的按钮
JButton(Icon icon)
JButton 常用方法:
// 设置按钮的 文本、字体 和 字体颜色
void setText(String text)
void setFont(Font font)
void setForeground(Color fg)
JButton 常用监听器:
// 添加 和 移除 按钮的点击事件
void addActionListener(ActionListener listener)
void removeActionListener(ActionListener listener)
// 创建面板(容器组件)
JPanel panel = new JPanel();
// 创建一个按钮
JButton btn = new JButton("测试按钮");
// 添加按钮的点击事件监听器
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 对话框
JDialog dialog =new JDialog(frame,"对话框",true);
dialog.setLocationRelativeTo(null);
dialog.setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE);
dialog.setSize(100, 100);
dialog.setVisible(true);
}
});
// 添加按钮
panel.add(btn);
// 窗体添加面板
frame.setContentPane(panel);
这里一定要注意按钮的点击事件处理,一下是上述代码运行中,点击按钮后效果,
JTextField,文本框。JTextField 用来编辑单行的文本。
JTextField 常用构造方法:
JTextField()
JTextField(String text)
JTextField(int columns)
JTextField(String text, int columns)
JTextField 常用方法:
// 获取文本框中的文本
String getText()
// 设置文本框的 文本、字体 和 字体颜色
void setText(String text)
void setFont(Font font)
void setForeground(Color fg)
// 设置颜色,分别为: 光标颜色、呈现选中部分的背景颜色、选中部分文本的颜色、不可用时文本的颜色
void setCaretColor(Color c)
void setSelectionColor(Color c)
void setSelectedTextColor(Color c)
void setDisabledTextColor(Color c)
// 设置文本内容的水平对齐方式
void setHorizontalAlignment(int alignment)
// 设置文本框是否可编辑
void setEditable(boolean b)
/* 下面方法定义在 java.awt.Component 基类中 */
// 判断组件当前是否拥有焦点
boolean isFocusOwner()
// 设置组件是否可用
void setEnabled(boolean b)
JTextField 复制粘贴相关方法:
// 设置光标开始位置,selectionStart >= 0
void setSelectionStart(int selectionStart)
// 设置光标结束位置,selectionEnd >= selectionStart
void setSelectionEnd(int selectionEnd)
// 复制选中部分文本
void copy()
// 剪切选中部分文本
void cut()
// 粘贴文本到文本框
void paste()
JTextField 常用监听器:
// 添加焦点事件监听器
void addFocusListener(FocusListener listener)
// 添加文本框内的 文本改变 监听器
textField.getDocument().addDocumentListener(DocumentListener listener)
// 添加按键监听器
void addKeyListener(KeyListener listener)
// 创建文本框,指定可见列数为8列
JTextField text = new JTextField(8);
text.setFont(new Font(null, Font.PLAIN, 14));
panel.add(text);
// 创建一个按钮,点击后获取文本框中的文本
JButton btn = new JButton("获取文本");
btn.setFont(new Font(null, Font.PLAIN, 14));
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("文本: " + text.getText());
}
});
panel.add(btn);
上述代码中,我们使用了一个按钮,通过点击事件获取文本框的getText方法里面的内容。
JList,列表框。JList 以列表的形式展示多个选项,允许用户选择一个或多个选项。其中的选项内容由一个 ListModel 实例来维护。JList 不实现直接滚动,需要滚动显示,可以结合 JScrollPane 实现滚动效果。ListModel 实例可以直接创建,也可以通过把 数组 或 集合 传递到 JList 中间接创建。
JList 常用构造方法:
JList()
JList(ListModel dataModel)
JList(Object[] listData)
JList(Vector<?> listData)
JList 选项数据 相关方法:
// 以数组形式设置选项数据,内部将自动封装成 ListModel
void setListData(Object[] listData)
// 以集合形式设置选项数据,内部将自动封装成 ListModel
void setListData(Vector<?> listData)
// 直接设置选项数据的 ListModel
void setModel(ListModel<?> model)
// 获取维护选项数据的 ListModel。
// 再通过 listModel.getElementAt(int index) 和 listModel.getSize()
// 可分别 获取指定索引的选项数据 和 选项数量。
ListModel<?> getModel()
JList 选项选中索引 相关方法:
// 设置选择模式,有三个模式: 只能单选、可间隔多选、可连续多选
void setSelectionMode(int selectionMode)
// 设置某个选项选中
void setSelectedIndex(int index)
// 设置某一些选项选中
void setSelectedIndices(int[] indices)
// 获取第一个选中的选项索引
int getSelectedIndex()
// 获取所有选中的选项索引
int[] getSelectedIndices()
JList 字体和颜色 相关方法:
// 设置字体
void setFont(Font font)
// 设置字体颜色(未选中时)
void setForeground(Color fg)
// 设置选中选项的字体颜色
void setSelectionForeground(Color selectionForeground)
// 设置选中条的颜色
void setSelectionBackground(Color selectionBackground)
JList 监听器 相关方法:
// 添加选项选中状态被改变的监听器
void addListSelectionListener(ListSelectionListener listener)
// 创建面板(容器组件)
JPanel panel = new JPanel();
// 创建JList组件
JList<String> list = new JList<String>();
// 设置JList组件大小
list.setPreferredSize(new Dimension(200, 100));
// 设置单选模式
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
// 设置ListModel
list.setListData(new String[]{"张三", "李四", "王五", "赵六"});
// JList组件选中事件
list.addListSelectionListener(new ListSelectionListener() {
// 该方法会被执行两次,鼠标按下执行一次,鼠标抬起执行一次
@Override
public void valueChanged(ListSelectionEvent e) {
// 鼠标按下事件直接返回,鼠标抬起事件才执行下方代码
if(e.getValueIsAdjusting()) return;
// 获取选中的索引值
int index = list.getSelectedIndex();
// 获取ListModel
ListModel<String> listModel = list.getModel();
// 输出选中项
System.out.println("选中: " + listModel.getElementAt(index));
}
});
// 设置默认选中项
list.setSelectedIndex(0);
// 添加到内容面板容器
panel.add(list);
上述代码中,注意JList选中事件的处理,尤其是valueChanged方法执行两次的判断。
关于其他组件的使用方式,我们就不一一介绍了,有兴趣的同学可以自行学习。
本课程涉及的代码可以免费下载:
https://download.csdn.net/download/richieandndsc/85645935
今天的内容就讲的这里,我们来总结一下。今天我们主要讲了Java Swing。这部分章节主要以理解为主,不要求大家能够使用Swing进行功能开发。因为在Web开发中,图形化界面都是以网页的形式在浏览器中展示的,网页则是使用Div+Css进行开发的,而不是Swing。就算是开发图形化的桌面程序,更多的开发人员可能也不会选择使用Swing。但是,Java Swing确实足够的简单,可以帮助我们快速实现简单的图形化设计,而且里面很多内容都是与其他图形化开发框架相通的。例如,在安卓APP开发中,也存在按钮组件以及点击事件处理,文本框组件,列表组件以及选中事件处理,再比如,布局管理器也是同样的原理,包括流式布局,网格布局等等。如果有同学想要编写图形化桌面程序,那么Java Swing绝对是入门级的最佳选择。好的,谢谢大家的收看,欢迎大家在下方留言,我也会及时回复大家的留言的。