Swing框架实现(推荐基础场景)
Swing是Java标准库的一部分,适合桌面应用开发,单选按钮通过JRadioButton
和ButtonGroup
实现。
步骤详解
-
导入必要包
import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener;
-
创建单选按钮和分组
JRadioButton option1 = new JRadioButton("选项1"); JRadioButton option2 = new JRadioButton("选项2"); JRadioButton option3 = new JRadioButton("选项3"); ButtonGroup group = new ButtonGroup(); // 创建按钮组 group.add(option1); // 将按钮加入组 group.add(option2); group.add(option3);
ButtonGroup
确保组内单选互斥
-
添加事件监听
ActionListener radioListener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { JRadioButton selected = (JRadioButton) e.getSource(); System.out.println("选中: " + selected.getText()); } }; option1.addActionListener(radioListener); option2.addActionListener(radioListener); option3.addActionListener(radioListener);
-
完整示例代码
public class RadioDemo extends JFrame { public RadioDemo() { setTitle("单选按钮示例"); setLayout(new FlowLayout()); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 创建按钮 JRadioButton javaBtn = new JRadioButton("Java"); JRadioButton pythonBtn = new JRadioButton("Python"); JRadioButton cppBtn = new JRadioButton("C++"); // 分组 ButtonGroup group = new ButtonGroup(); group.add(javaBtn); group.add(pythonBtn); group.add(cppBtn); // 添加监听 ActionListener listener = e -> { JRadioButton btn = (JRadioButton) e.getSource(); JOptionPane.showMessageDialog(this, "已选择: " + btn.getText()); }; javaBtn.addActionListener(listener); pythonBtn.addActionListener(listener); cppBtn.addActionListener(listener); // 添加到窗口 add(javaBtn); add(pythonBtn); add(cppBtn); pack(); setVisible(true); } public static void main(String[] args) { SwingUtilities.invokeLater(RadioDemo::new); } }
关键点
- 使用
ButtonGroup
管理互斥逻辑 - 通过
setSelected(true)
设置默认选中 - 用
isSelected()
检查按钮状态
JavaFX框架实现(推荐现代UI)
JavaFX提供更现代的界面,通过ToggleGroup
和RadioButton
实现。
步骤详解
-
创建单选按钮和分组
RadioButton btn1 = new RadioButton("苹果"); RadioButton btn2 = new RadioButton("香蕉"); RadioButton btn3 = new RadioButton("橙子"); ToggleGroup group = new ToggleGroup(); // 创建分组 btn1.setToggleGroup(group); // 加入分组 btn2.setToggleGroup(group); btn3.setToggleGroup(group);
-
添加事件监听
group.selectedToggleProperty().addListener((obs, oldVal, newVal) -> { if (newVal != null) { RadioButton selected = (RadioButton) newVal; System.out.println("选中: " + selected.getText()); } });
-
完整示例代码
import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.*; import javafx.scene.layout.VBox; import javafx.stage.Stage; public class JavaFXRadioDemo extends Application { @Override public void start(Stage stage) { RadioButton rbRed = new RadioButton("红色"); RadioButton rbGreen = new RadioButton("绿色"); RadioButton rbBlue = new RadioButton("蓝色"); ToggleGroup colorGroup = new ToggleGroup(); rbRed.setToggleGroup(colorGroup); rbGreen.setToggleGroup(colorGroup); rbBlue.setToggleGroup(colorGroup); VBox root = new VBox(10, rbRed, rbGreen, rbBlue); root.setPadding(new Insets(20)); // 事件处理 colorGroup.selectedToggleProperty().addListener((obs, oldVal, newVal) -> { if (newVal != null) { String color = ((RadioButton) newVal).getText(); root.setStyle("-fx-background-color: " + colorToHex(color)); } }); stage.setScene(new Scene(root, 300, 200)); stage.setTitle("JavaFX单选按钮"); stage.show(); } // 颜色转换逻辑(示例) private String colorToHex(String color) { switch (color) { case "红色": return "#FF0000"; case "绿色": return "#00FF00"; case "蓝色": return "#0000FF"; default: return "#FFFFFF"; } } public static void main(String[] args) { launch(args); } }
关键点
ToggleGroup
自动处理单选逻辑- 通过
selectedToggleProperty()
监听变化 - 使用CSS样式增强视觉效果
最佳实践建议
-
选择框架依据
- 维护旧项目 → 用Swing
- 开发新应用 → 用JavaFX(官方推荐未来方向)
-
用户体验优化
- 添加默认选中项:
radioButton.setSelected(true)
- 组合
JLabel
或Text
提示用户 - 使用
JPanel
/布局管理器(如GridLayout
)对齐控件
- 添加默认选中项:
-
常见问题解决
- 无法取消选中?
单选按钮设计为必选一项,如需取消,改用复选框(JCheckBox
)。 - 事件不触发?
检查ButtonGroup
是否包含所有按钮,或监听器绑定错误。 - 界面卡顿?
在Swing中确保用SwingUtilities.invokeLater()
启动GUI。
- 无法取消选中?
对比总结
特性 | Swing | JavaFX |
---|---|---|
是否需要额外库 | 否(Java标准库) | 否(JDK内置) |
界面美观度 | 中等(可搭配Synth美化) | 高(支持CSS3D特效) |
开发复杂度 | 简单 | 中等(需学新API) |
适用场景 | 小型工具、旧系统维护 | 新项目、跨平台应用 |
引用说明
本文代码示例基于Oracle官方文档[^1][^2],遵循Java编码规范,Swing和JavaFX均为Java标准GUI库,无需第三方依赖。
[^1]: Oracle Swing教程
[^2]: Oracle JavaFX文档
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/23434.html