Java Swing循环创建JButton设置唯一ID及点击切换背景色实现问题
实现方案
最优实现思路(无需依赖ID属性,性能更高)
你不需要通过ID查找按钮,只需要新增一个成员变量记录当前处于选中状态的按钮即可,逻辑如下:
- 新增
JButton类型的成员变量,存储当前被选中的黄色背景按钮 - 每次点击新按钮时,先将之前记录的选中按钮背景改为红色
- 将当前点击的按钮背景改为黄色,再更新成员变量为当前点击的按钮即可
修改后的完整代码如下:
package Classes; import java.awt.Color; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.SwingUtilities; public class testbtn { public JFrame frame = new JFrame(); public int copcounter = 5; // 新增成员变量记录当前选中的按钮 private JButton currentSelectedBtn; public testbtn() { JPanel jdb = new JPanel(); jdb.setLayout(new FlowLayout()); for (int x = 1; x <= copcounter; x++) { JButton btn = new JButton(); btn.setText(String.valueOf(x)); if (x == 1) { btn.setBackground(Color.yellow); // 初始化时默认第一个按钮为选中状态 currentSelectedBtn = btn; } else { btn.setBackground(Color.red); } btn.putClientProperty("id", x); btn.addActionListener((ActionEvent e) -> { // 把之前选中的按钮改回红色 currentSelectedBtn.setBackground(Color.RED); // 获取当前点击的按钮 JButton clickBtn = (JButton) e.getSource(); // 当前点击按钮改为黄色 clickBtn.setBackground(Color.YELLOW); // 更新选中状态记录 currentSelectedBtn = clickBtn; // 如需获取当前按钮ID可使用下方代码 int btnId = (int) clickBtn.getClientProperty("id"); System.out.println("当前点击按钮ID:" + btnId); }); jdb.add(btn); } frame.add(jdb); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } public static void main(String[] args) { SwingUtilities.invokeLater(() -> new testbtn()); } }
基于ID的实现方案(可选)
如果你确实需要使用自定义ID属性实现,可以在点击事件中遍历jdb面板中的所有组件,判断为JButton类型后对比ID,将非当前点击ID的按钮全部改为红色即可,该方案在按钮数量较多时性能略低于前一种方案。
内容的提问来源于stack exchange,提问作者Adeeb Mark
相关产品推荐
相关产品推荐

