Java GUI开发:创建多个相似JButton时如何避免代码重复
当然有啦!你这段代码里每个按钮的创建、配置逻辑几乎一模一样,重复写不仅麻烦,以后要改字体、大小之类的参数也得挨个修改,效率太低。下面给你几个实用的优化方案,从简单到进阶都有:
方案1:封装按钮创建工具方法
把重复的按钮初始化逻辑抽成一个独立方法,每次创建按钮只需要传入差异化的参数(文本、坐标)就行,代码瞬间清爽很多:
// 先定义一个私有工具方法,封装按钮的通用配置 private JButton createCustomButton(String buttonText, int xPos, int yPos) { JButton button = new JButton(buttonText); // 把通用的字体、大小配置放在这里,以后改只需要改一处 button.setFont(new Font("Tahoma", Font.PLAIN, 20)); button.setBounds(xPos, yPos, 355, 155); return button; } // 现在创建按钮就一行搞定一个! JButton btnAddCar = createCustomButton("Add Car", 5, 5); addInternalFrame.getContentPane().add(btnAddCar); JButton btnAddHybridCar = createCustomButton("Add Hybrid Car", 5, 165); addInternalFrame.getContentPane().add(btnAddHybridCar); JButton btnAddVan = createCustomButton("Add Van", 5, 325); addInternalFrame.getContentPane().add(btnAddVan); // 剩下的按钮依此类推,代码量直接砍半
方案2:批量循环创建按钮
如果按钮数量特别多,还可以把所有按钮的差异化数据(文本、坐标)集中存到数组里,然后通过循环批量创建和添加按钮,管理起来更方便:
// 用二维数组存储每个按钮的文本、x坐标、y坐标 Object[][] buttonInfoList = { {"Add Car", 5, 5}, {"Add Hybrid Car", 5, 165}, {"Add Van", 5, 325}, {"Add Motorcycle", 5, 485}, {"Add Hybrid Motorcycle", 5, 645}, {"Add Customer", 365, 5}, {"Add VIP Customer", 365, 165}, {"Add Employee", 365, 325}, {"Add Department Manager", 365, 485} }; // 先拿到内容面板,避免重复调用 Container contentPane = addInternalFrame.getContentPane(); // 提前创建好字体对象,避免重复实例化 Font buttonFont = new Font("Tahoma", Font.PLAIN, 20); // 循环遍历数据,批量创建按钮 for (Object[] buttonInfo : buttonInfoList) { String text = (String) buttonInfo[0]; int x = (int) buttonInfo[1]; int y = (int) buttonInfo[2]; JButton button = new JButton(text); button.setFont(buttonFont); button.setBounds(x, y, 355, 155); contentPane.add(button); }
这种方式的好处是,所有按钮的配置数据都集中在一起,要修改某个按钮的位置或者文本,直接改数组里的元素就行,不用翻找一堆代码。
方案3:用布局管理器替代绝对布局(强烈推荐)
你现在用setBounds属于绝对布局,这种方式的缺点很明显:窗口大小变化时按钮不会自适应,不同分辨率的屏幕上显示效果也可能乱掉。换成Java Swing提供的布局管理器(比如GridLayout、FlowLayout、BoxLayout),不仅能减少坐标相关的重复代码,界面还会更灵活健壮:
比如用GridLayout实现你想要的2列布局:
Container contentPane = addInternalFrame.getContentPane(); // 设置为2列,自动换行,按钮之间的水平/垂直间距设为10像素 contentPane.setLayout(new GridLayout(0, 2, 10, 10)); Font buttonFont = new Font("Tahoma", Font.PLAIN, 20); // 只需要列出所有按钮的文本就行,位置交给布局管理器处理 String[] buttonTexts = { "Add Car", "Add Hybrid Car", "Add Van", "Add Motorcycle", "Add Hybrid Motorcycle", "Add Customer", "Add VIP Customer", "Add Employee", "Add Department Manager" }; for (String text : buttonTexts) { JButton button = new JButton(text); button.setFont(buttonFont); // 可以设置按钮的偏好大小,布局管理器会尽量遵循这个设置 button.setPreferredSize(new Dimension(355, 155)); contentPane.add(button); }
这样代码最简洁,而且窗口放大缩小时,按钮会自动调整排列方式,用户体验好很多。
内容的提问来源于stack exchange,提问作者Josef Sigron
相关产品推荐
相关产品推荐

