Java Swing开发仿Windows计算器:如何基于DRY批量修改JButton通用属性
完全可以通过代码复用的方式一次性统一配置这组计算器按钮的通用属性,完全符合DRY开发原则,可大幅减少重复编写setFont、setSize、setBorder这类属性设置代码的工作量,以下是几种常用的落地方法:
1. 自定义按钮工厂类统一生成
这是Swing开发中最常用的复用方案,将所有同属性按钮的通用配置抽离到独立的工厂方法中,生成按钮时只需要传入差异化参数(比如按钮文本、点击监听器)即可,无需重复编写通用属性逻辑。
示例代码:
public class CalcButtonFactory { // 抽离通用配置为静态常量,避免重复创建对象 private static final Font COMMON_FONT = new Font("微软雅黑", Font.PLAIN, 16); private static final Dimension COMMON_SIZE = new Dimension(60, 40); private static final Insets COMMON_MARGIN = new Insets(5, 10, 5, 10); public static JButton createCalcButton(String btnText, ActionListener clickHandler) { JButton button = new JButton(btnText); // 通用属性一次性统一设置,全组按钮共用 button.setFont(COMMON_FONT); button.setPreferredSize(COMMON_SIZE); button.setMargin(COMMON_MARGIN); button.setFocusPainted(false); // 移除按钮默认聚焦虚线 button.setContentAreaFilled(true); button.addActionListener(clickHandler); return button; } }
实际使用时可以通过循环批量生成数字键、基础运算符键,完全无需重复写属性设置:
// 批量生成0-9数字按钮 ActionListener numberInputListener = e -> { JButton source = (JButton) e.getSource(); inputField.setText(inputField.getText() + source.getText()); }; for (int i = 0; i <= 9; i++) { JButton numButton = CalcButtonFactory.createCalcButton(String.valueOf(i), numberInputListener); buttonPanel.add(numButton); }
2. UIManager全局统一配置默认按钮样式
如果希望全局对应用内所有JButton生效,可以直接在Swing界面初始化阶段,通过UIManager修改JButton的默认渲染参数,从UI层统一控制通用属性,无需逐个给按钮实例设置:
// 在界面初始化前全局设置按钮通用属性 UIManager.put("Button.font", new Font("微软雅黑", Font.PLAIN, 16)); UIManager.put("Button.focus", new Color(0, 0, 0, 0)); // 全局移除按钮聚焦效果 UIManager.put("Button.margin", new Insets(5, 10, 5, 10));
如果有部分按钮需要差异化样式(比如“等于”按钮设置专属背景色),只需要单独给该按钮实例覆盖对应属性即可,不会影响通用配置的批量生效。
3. 批量遍历按钮集合统一修改属性
如果已经完成了所有按钮的实例化,只是需要统一调整通用属性,可以将同组按钮收集到一个集合中,通过循环遍历批量修改属性,避免逐个编写重复的set方法:
// 收集所有计算器功能按钮到统一集合 List<JButton> allCalcButtons = Arrays.asList( btn0, btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8, btn9, btnAdd, btnSub, btnMultiply, btnDivide ); // 一次性批量修改所有按钮的通用属性 allCalcButtons.forEach(btn -> { btn.setFont(new Font("微软雅黑", Font.PLAIN, 16)); btn.setPreferredSize(new Dimension(60, 40)); btn.setFocusPainted(false); btn.setBorder(BorderFactory.createRaisedBevelBorder()); });
开发注意事项
- 通用配置尽量抽为静态常量,不要在循环里重复创建
Font、Dimension这类对象,避免不必要的内存开销- 工厂类可以根据需求增加重载方法,支持传入差异化样式参数(比如特殊颜色、自定义尺寸),在不破坏通用复用逻辑的前提下适配特殊按钮需求
- 如果需要适配不同分辨率的屏幕显示,可以将通用尺寸改为基于屏幕DPI动态计算的值,批量生效无需单独调整每个按钮
内容的提问来源于stack exchange,提问作者user15208321
相关产品推荐
相关产品推荐

