那个我朋友说可以一次介绍完,也是,一个简单的组件,非要说这么麻烦,有点小题大作了,就先把这个讲完了在去做之前的知识点,之前是因为我有一天一直想找一个知识点,但找不到,一搜索就是CSDN,但是看就要开VIP,然后我就想我也可以将文章发在这上面,一方面监督我的学习,一方名做个笔记,其实这些组件我一个小时就看完了,所以我朋友说的也有点道理,今天就直接把剩余的组件一块说了。
标签组件
Swing中的标签只有一个目的,显示,显示文本或者是图。JLabel是一个最简单的标签组件,当然,看过了前面文章的都知道,这里要注意,JLabel
是 Swing 中唯一的专用标签组件。支持文本、图标、HTML、快捷键等丰富特性。通过自定义 LabelUI
或继承 JLabel
实现复杂样式。
这个组件也比较好理解,我个人的理解是相当于HTML中的<p>,当然,这两个是不同的。那么就直接来展示吧!
package chapter4;
import javax.swing.*;
import java.awt.*;
public class JLabel_Test {
public static void main(String[] args) {
JFrame jFrame = new JFrame("测试");
jFrame.setLayout(new GridBagLayout());//设置布局管理器
JLabel jLabel = new JLabel("这是标签组件的显示文本功能");
jLabel.setPreferredSize(new Dimension(200,200));
jLabel.setBackground(Color.red);
jLabel.setOpaque(true); // 必须设置不透明属性才能显示背景色
jFrame.add(jLabel);
jFrame.setSize(500,500);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 建议补充关闭操作
jFrame.setVisible(true);
}
}
如果我们实例化的时候换成这一句代码,那么标签就可以直接显示图片,这里注意引用路径。
JLabel jlabel = new JLabel(new ImageIcon("文件路径"));
那么JLabel的功能就介绍完了。注意,它本身不是一个容器,就是一个显示文本或者图像的一个组件,只能被添加到其他的容器中去。 当然这里展示的是单独显示文字或者是图像,也可以两者同时显示
JLabel compoundLabel = new JLabel("带图文本", icon, SwingConstants.RIGHT);
可以使用对齐方法进行控制文本内容。
这里我给大家用表格列举一些常用的方法
分类 | 方法/参数 | 可选值/示例 | 默认值 | 注意事项 |
---|---|---|---|---|
文本控制 | setText(String text) | label.setText("<html>带<b>样式</b>文本</html>") | 空字符串 | 支持HTML标签实现多行/图文混排 |
getText() | String content = label.getText() | - | 返回原始文本(包含HTML标签) | |
图标控制 | setIcon(Icon icon) | label.setIcon(new ImageIcon("icon.png")) | null | 推荐使用ImageIO 读取保证跨平台兼容性 |
getIcon() | ImageIcon icon = (ImageIcon)label.getIcon() | - | 需做类型转换 | |
对齐方式 | setHorizontalAlignment(int) | JLabel.LEFT <br>JLabel.CENTER <br>JLabel.RIGHT <br>JLabel.LEADING (推荐) | JLabel.LEADING | LEADING根据LTR/RTL语言自动适配 |
| JLabel.TOP <br>JLabel.CENTER <br>JLabel.BOTTOM | JLabel.CENTER | 图文混合时效果更明显 | |
样式控制 | setFont(Font) | new Font("微软雅黑", Font.BOLD|Font.ITALIC, 14) | 继承容器字体 | 使用逻辑字体名保证跨平台 |
setForeground(Color) | Color.RED <br>new Color(255,0,0) | 系统文本色 | 优先使用预定义颜色常量 | |
setBackground(Color) | label.setOpaque(true); <br>label.setBackground(Color.YELLOW); | 透明 | ★ 必须设置setOpaque(true) 生效 | |
状态控制 | setEnabled(boolean) | label.setEnabled(false) → 灰色效果 | true | 禁用时同时影响文本和图标 |
setToolTipText(String) | label.setToolTipText("<html>多行<br>提示") | null | 支持HTML实现复杂提示 | |
高级特性 |
| label.setDisplayedMnemonic('S'); | 无 | 需配合关联组件使用 |
setLabelFor(Component) | label.setLabelFor(textField); → Alt+S聚焦输入框 | null | 实现无障碍访问的重要设置 |
按钮组件
按钮组件好理解吧,就是一个按钮,像灯一样的按钮。不过功能上更加的复杂,JButton是Swing体系中最基础的交互组件,不仅支持文本/图标显示,还具备完整的用户交互能力。与JLabel的被动显示不同,JButton具有多种交互状态(悬停、按下、禁用等),可绑定事件响应,是实现用户操作的核心组件。也就是说这个按钮是一个“有生命的”组件,可以于用户产生互动的一个组件。
来看如何实现一个基本按钮:
package chapter4;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
public class JButton_Test {
public static void main(String[] args) {
JFrame frame = new JFrame("按钮测试");
frame.setLayout(new GridBagLayout());
// 创建基础按钮
JButton button = new JButton("点击提交");
button.setPreferredSize(new Dimension(180, 60));
button.setBackground(new Color(70, 130, 180));
button.setForeground(Color.WHITE);
button.setFont(new Font("微软雅黑", Font.BOLD, 14));
frame.add(button);
frame.setSize(400, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
可以看到这是一个最基本的按钮组件,没有任何的功能,这里我不介绍监听,因为这个放在后面来看比较合适,这里就单纯的介绍一个简单的按钮组件。
那么按钮的常用的方法也是和其他的组件大同小异的,这里也使用AI直接生成一些常用方法的总结
分类 | 方法/参数 | 默认值 | 注意事项 |
---|---|---|---|
基础属性 | setText(String) <br>getText() | 空 | 支持HTML实现图文混排 |
setMnemonic(int) | btn.setMnemonic(KeyEvent.VK_S) | Alt+S触发点击 | |
图标控制 | setIcon(Icon) <br>setRolloverIcon(Icon) <br>setPressedIcon(Icon) | null | 建议准备4种状态图标 |
样式控制 | setBackground(Color) <br>setBorder(Border) | 系统默认 | 推荐使用BorderFactory 创建边框 |
setFocusPainted(boolean) | btn.setFocusPainted(false) | 取消焦点虚线框 | |
交互事件 | addActionListener | 无 | 支持多个监听器 |
setSelected(boolean) | 配合ButtonGroup 使用 | 实现单选按钮组 | |
状态控制 | setEnabled(boolean) | true | 禁用时自动应用disableIcon |
setToolTipText(String) | btn.setToolTipText("<html>多行提示") | 支持富文本 | |
高级特性 | setModel(ButtonModel) | Default | 扩展按钮交互逻辑 |
doClick() | btn.doClick(500) | 程序触发点击动画(500ms) |
文本组件
Swing提供多层级文本输入支持,从基础单行输入到富文本编辑器,满足不同场景需求。核心组件包括:JTextField
(单行输入)、JTextArea
(多行文本)、JPasswordField
(密码输入)、JEditorPane
(HTML/RTF渲染)。这四个文本组件比较好理解,一个四单行文本,一个是文本域,一个是带有输入之后显示为*号的密码输入,还有一个是文本渲染,可以说还是结构比较清晰。直接上代码
package chapter4;
import javax.swing.*;
import java.awt.*;
public class TextComponentDemo {
public static void main(String[] args) {
JFrame frame = new JFrame("文本输入组件");
frame.setLayout(new GridLayout(3, 1, 5, 5)); // 3行1列,间距5像素
// 1. 单行文本框
JTextField textField = new JTextField(20); // 20列宽度
textField.setBorder(BorderFactory.createTitledBorder("普通输入"));
// 2. 密码输入框
JPasswordField passwordField = new JPasswordField(20);
passwordField.setBorder(BorderFactory.createTitledBorder("密码输入"));
passwordField.setEchoChar('*'); // 设置密码掩码
// 3. 多行文本域(自动带滚动条)
JTextArea textArea = new JTextArea(5, 20); // 5行20列
JScrollPane scrollPane = new JScrollPane(textArea);
scrollPane.setBorder(BorderFactory.createTitledBorder("多行文本"));
// 添加组件
frame.add(textField);
frame.add(passwordField);
frame.add(scrollPane);
frame.setSize(300, 400);
frame.setLocationRelativeTo(null); // 窗口居中
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
这里我也是用代码实现了3种常用的JText文本组件的使用,那么文本组件有没有什么特别注意的地方呢,这里文本组件的构造方法也有不同,
以下是JText的常用方法的表格示例:
方法名称 | 描述 | 示例代码 |
---|---|---|
setText(String text) | 设置组件文本内容 | textField.setText("Hello") |
getText() | 获取组件文本内容 | String content = area.getText() |
setEditable(boolean b) | 设置文本可编辑状态 | textPane.setEditable(false) |
setFont(Font font) | 设置文本字体 | field.setFont(new Font("宋体", Font.PLAIN, 12)) |
setForeground(Color c) | 设置文本颜色 | area.setForeground(Color.BLUE) |
setCaretPosition(int pos) | 设置光标位置 | textPane.setCaretPosition(0) |
selectAll() | 全选文本内容 | field.selectAll() |
getSelectedText() | 获取选中文本 | String sel = area.getSelectedText() |
append(String str) | 追加文本 | area.append("new text\\n") |
Jpassword的特有方法:
方法名 | 返回值类型 | 参数 | 功能说明 |
---|---|---|---|
getPassword() | char[] | 无 | 获取密码字符数组(比getText() 更安全) |
setEchoChar(char) | void | char echoChar | 设置密码显示掩码字符(如* ) |
getEchoChar() | char | 无 | 获取当前使用的掩码字符 |
echoCharIsSet() | boolean | 无 | 检测是否设置了掩码字符 |
注意:继承自
JTextField
的getText()
方法已被标记为@Deprecated
,建议使用getPassword()
替代以保证安全性。
当然,我们在学习过程中使用AI确实方便,但是这些方法我还是认为有必要要了解一遍,至少知道运行结果和功能是什么,不希望直接使用。这里我使用了ai优化了表格,添加的都是一些常用的方法。
菜单组件
所谓菜单组件,最直观的就是网页上面有好多类别的文章,这就是菜单组件
菜单组件一样的,肯定有基本的菜单,也有一些变体,实际上它们怎么变都是菜单,不会难到哪里去。那么我是用思维导图直接给出结构。
比价简单,菜单,菜单项,菜单条,单选菜单,多选菜单,。五个结构,
菜单条就是顶部那一条有菜单的位置,里面有菜单,菜单里面有菜单项,单选菜单,多选菜单等。
直接用代码来显示效果,
我用代码实现了基本的菜单,当然,只有样子,没有实际的功能。
package chapter4;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
public class MenuComponentDemo {
public static void main(String[] args) {
JFrame frame = new JFrame("菜单组件示例");
frame.setLayout(new BorderLayout());
// 创建菜单条
JMenuBar menuBar = new JMenuBar();
// 文件菜单(基本菜单)
JMenu fileMenu = createFileMenu();
// 视图菜单(多选菜单)
JMenu viewMenu = createViewMenu();
// 语言菜单(单选菜单)
JMenu languageMenu = createLanguageMenu();
// 将菜单添加到菜单条
menuBar.add(fileMenu);
menuBar.add(viewMenu);
menuBar.add(languageMenu);
frame.setJMenuBar(menuBar);
// 窗口属性设置
frame.setSize(450, 300); // 加宽窗口以适应新菜单
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
// ======================= 新增语言菜单构造方法 =======================
private static JMenu createLanguageMenu() {
JMenu languageMenu = new JMenu("语言");
languageMenu.setMnemonic('L'); // 快捷键 Alt+L
// 创建单选按钮组
ButtonGroup languageGroup = new ButtonGroup();
// 语言选项
JRadioButtonMenuItem chineseItem = new JRadioButtonMenuItem("中文");
JRadioButtonMenuItem englishItem = new JRadioButtonMenuItem("英文");
JRadioButtonMenuItem japaneseItem = new JRadioButtonMenuItem("日文");
// 加入按钮组
languageGroup.add(chineseItem);
languageGroup.add(englishItem);
languageGroup.add(japaneseItem);
// 设置默认选中
chineseItem.setSelected(true);
languageMenu.add(chineseItem);
languageMenu.add(englishItem);
languageMenu.add(japaneseItem);
return languageMenu;
}
private static JMenu createFileMenu() {
JMenu fileMenu = new JMenu("文件");
fileMenu.setMnemonic('F'); // 快捷键 Alt+F
// 1. 新建菜单项
JMenuItem newItem = new JMenuItem("新建", KeyEvent.VK_N);
// 2. 打开菜单项
JMenuItem openItem = new JMenuItem("打开", KeyEvent.VK_O);
// 3. 保存菜单项
JMenuItem saveItem = new JMenuItem("保存", KeyEvent.VK_S);
// 4. 退出菜单项
JMenuItem exitItem = new JMenuItem("退出", KeyEvent.VK_X);
// 添加组件到菜单
fileMenu.add(newItem);
fileMenu.add(openItem);
fileMenu.add(saveItem);
fileMenu.addSeparator(); // 分隔线
fileMenu.add(exitItem);
return fileMenu;
}
private static JMenu createViewMenu() {
JMenu viewMenu = new JMenu("视图");
viewMenu.setMnemonic('V');
JCheckBoxMenuItem checkBoxItem1 = new JCheckBoxMenuItem("显示工具栏");
checkBoxItem1.setMnemonic('T'); // 设置快捷键 Alt+T
checkBoxItem1.setSelected(true); // 默认选中
JCheckBoxMenuItem checkBoxItem2 = new JCheckBoxMenuItem("显示状态栏");
checkBoxItem2.setMnemonic('S'); // 设置快捷键 Alt+S
// 将菜单项添加到视图菜单
viewMenu.add(checkBoxItem1);
viewMenu.add(checkBoxItem2);
viewMenu.addSeparator(); // 添加分隔线(可选)
return viewMenu;
}
}
菜单组件的常用方法
方法名称 | 描述 | 示例代码 |
---|---|---|
add(JMenu menu) | 将菜单添加到菜单条 | menuBar.add(fileMenu); |
add(JMenuItem item) | 将菜单项添加到菜单 | fileMenu.add(newItem); |
addSeparator() | 添加分隔线 | fileMenu.addSeparator(); |
setMnemonic(char key) | 设置菜单的快捷键 | fileMenu.setMnemonic('F'); |
setAccelerator(KeyStroke) | 设置菜单项的快捷键组合 | newItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, ActionEvent.CTRL_MASK)); |
setSelected(boolean b) | 设置复选菜单项的选择状态 | showStatusBarItem.setSelected(true); |
isSelected() | 获取复选菜单项的选择状态 | boolean isSelected = showStatusBarItem.isSelected(); |
细节分享
- 快捷键设置:使用
setMnemonic
和setAccelerator
方法可以为菜单项设置快捷键,提高用户体验。 - 动作监听器:通过
addActionListener
方法可以为菜单项添加动作监听器,实现点击菜单项时的响应逻辑。 - 复选菜单项:
JCheckBoxMenuItem
可以用于创建复选菜单项,通过setSelected
和isSelected
方法可以控制和获取其选择状态。 - 分隔线:使用
addSeparator
,看个人的喜好,一般桌面应用都用这个。
可以说,我们在使用菜单组件的时候,需要按照个人的需求去使用,菜单一般是配合监听使用的,我们点击了菜单,就要发生具体的一个功能,如何去实现这些功能才是重要的,菜单只是用来给用户看的,我们作为后面具体的功能实现者一定要结构清晰。
组件其实有很多,这四大类已经可以建立一个基本的GUI图形用户界面了,组件我使用deepseek总结了,如果你想学习更多的组件,可以看下面的这个表格
组件名称 | 类型/分类 | 核心功能 | 典型应用场景 |
---|---|---|---|
JToolBar | 工具栏容器 | 创建可拖动的工具栏,存放常用操作按钮 | 快速访问工具(如编辑器工具栏) |
JRadioButton | 选择控件 | 单选按钮(需配合 ButtonGroup 使用) | 互斥选项(如性别选择) |
JList | 列表控件 | 显示一维数据列表(支持单选或多选) | 简单列表展示(如文件列表) |
JTree | 高级控件 | 展示树形结构数据(支持节点展开/折叠) | 文件目录结构、组织架构图 |
JFileChooser | 对话框 | 打开或保存文件的系统对话框 | 文件上传、保存路径选择 |
JColorChooser | 对话框 | 颜色选择器 | 绘图工具颜色设置 |
JProgressBar | 进度控件 | 显示任务进度(水平或垂直样式) | 文件下载、任务执行进度 |
JSlider | 滑动控件 | 通过滑块选择数值范围 | 音量控制、亮度调节 |
JSpinner | 输入控件 | 数值增减器(通过上下箭头调整数值) | 数量选择、日期选择 |
JOptionPane | 对话框工具 | 快速生成标准对话框(确认框、输入框、消息框) | 提示用户确认操作或输入信息 |
这些是我没有提到的一些组件,具体的效果可以自行尝试。组件学习笔记也到此结束,明天没有课,更新布局管理器。最后给一个总体的结构图,也就是我的第一篇文章提到的一个总体结构图,记住了,计算机中图简直是我认为最能理解的东西了。