java swing 获取或设置新 JButton 的唯一 ID,同时在 for 循环中创建它

java swing get or set unique id for new JButton while create thim on for loop

我有 java 秋千 Class 创造 JButton

它正在工作,但我需要的是当我按下 JButton 让种子成为数字 1 ActionEvent 中的代码是更改 JButton 的背景但我需要的是如果我按下另一个 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;
        
            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);
        
                    } else {
        
                        btn.setBackground(Color.red);
        
                    }
        
                    btn.putClientProperty("id", x);
        
                    btn.addActionListener((ActionEvent e) -> {
        
                        btn.setBackground(Color.yellow);
        
                        System.out.println(e.getID());
        
                    });
        
                    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 Runnable() {
                    public void run() {
                        new testbtn();
                    }
                });
            }
        }

此代码将显示如下形式:

当我按下 JButton 4 时,输出变成这样:

但我需要它是这样的,这样另一个按钮就会变成红色,但我按下的按钮需要变成黄色! :

我知道我可以使用 id 但如何为他们获取 id !或者有更好的方法吗?

不需要 id,只需将所有 JButton 放入 List<JButton>,比如说 buttonList,然后遍历按钮的 ActionListener 中的列表,将所有按钮的背景变为红色在列表中,然后将当前按钮的背景变为黄色。

然后在使用它的代码中:

public void actionPerformed(ActionEvent e) {
    // iterate through the list
    for (JButton button : buttonList) {
        button.setBackground(Color.RED);
    }
    
    // then set *this* button's color yellow:
    ((JButton) e.getSource).setBackground(Color.YELLOW);
}

就是这样

或您的代码...

public class TestBtn {
    public JFrame frame = new JFrame();
    public int copcounter = 5;
    private List<JButton> buttonList = new ArrayList<>();

    public TestBtn() {
        JPanel jdb = new JPanel();
        jdb.setLayout(new FlowLayout());
        for (int x = 1; x <= copcounter; x++) {
            JButton btn = new JButton();
            
            // add this
            buttonList.add(btn);
            
            btn.setText(String.valueOf(x));
            if (x == 1) {
                btn.setBackground(Color.yellow);
            } else {
                btn.setBackground(Color.red);
            }
            // btn.putClientProperty("id", x);
            btn.addActionListener((ActionEvent e) -> {
                // iterate through the list
                for (JButton button : buttonList) {
                    button.setBackground(Color.RED);
                }
    
                // then set *this* button's color yellow:
                ((JButton) e.getSource).setBackground(Color.YELLOW);
                
                // show button text
                System.out.println(e.getActionCommand());  
            });
            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 Runnable() {
            public void run() {
                new testbtn();
            }
        });
    }
}

此外,ActionEvent 的 actionCommand 字符串应与按钮的文本匹配(有一些例外)。