有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为多个JButton提供相同的actionListener

我已经写了一个2x2x2的rubiks立方体解算器,我想让用户进入他们的立方体的体验更好,目前他们输入分配给立方体颜色的数字。例如,0可以表示白色,1可以表示黄色等。我一直在开发一个GUI,它是一个由按钮组成的2d立方体,当单击按钮时,它会在一系列颜色上循环。这是我到目前为止所拥有的,但我无法让actionListener应用于所有按钮

public static void main(String[] args) {

    final int WINDOW_HEIGHT = 500;
    final int WINDOW_WIDTH = 700;

    //create a window
    window.setTitle("First Window");
    window.setSize(WINDOW_WIDTH, WINDOW_HEIGHT);
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setVisible(true);
    window.setResizable(false);


        allButtons();
}

private static void allButtons(){
    panel.setLayout(null);
    window.add(panel);


     final JButton button[]=new JButton[23];
        for(int i=0;i<button.length;i++){
            button[i] = new JButton();
        }

        panel.add(button[0]);
        button[0].setBounds(30, 30, 60, 60);
        final Color[] ColorArray = {Color.WHITE, Color.ORANGE,Color.GREEN,Color.RED,Color.BLUE,Color.YELLOW};

        button[0].addActionListener(new ActionListener(){

            public void actionPerformed(ActionEvent e){
                final int stickerNum = 24;

                if(stickerNum <= 3){
                    for(Color i : ColorArray){
                    button[0].setBackground(i);
                    cube[Side][0] = 0;
                    }
                }
            }
        });
}

共 (2) 个答案

  1. # 1 楼答案

    只需将ActionListener实例分配给一个变量,并将其添加到循环中的JButtons

    public static void main(String[] args) {
    
        final int WINDOW_HEIGHT = 500;
        final int WINDOW_WIDTH = 700;
    
        //create a window
        window.setTitle("First Window");
        window.setSize(WINDOW_WIDTH, WINDOW_HEIGHT);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setVisible(true);
        window.setResizable(false);
    
        allButtons();
    }
    
    private static void allButtons(){
        panel.setLayout(null);
        window.add(panel);
    
        final JButton button[]=new JButton[23];
        for(int i=0;i<button.length;i++){
            button[i] = new JButton();
        }
    
        panel.add(button[0]);
        button[0].setBounds(30, 30, 60, 60);
        final Color[] ColorArray = {Color.WHITE, Color.ORANGE,Color.GREEN,Color.RED,Color.BLUE,Color.YELLOW};
    
        ActionListener actionListener = new ActionListener(){
    
            public void actionPerformed(ActionEvent e){
                final int stickerNum = 24;
    
                if(stickerNum <= 3){
                    for(Color i : ColorArray){
                        button[0].setBackground(i);
                        cube[Side][0] = 0;
                    }
                }
            }
        };
    
        for(int i=0;i<button.length;i++){
            button[i].addActionListener( actionListener);
        }
    }
    
  2. # 2 楼答案

    您只需创建一个ButtonListener类,如下所示,它存储索引。然后,只需向每个按钮添加侦听器的新实例

    public static void main(String[] args) {
    
        final int WINDOW_HEIGHT = 500;
        final int WINDOW_WIDTH = 700;
    
        //create a window
        window.setTitle("First Window");
        window.setSize(WINDOW_WIDTH, WINDOW_HEIGHT);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setVisible(true);
        window.setResizable(false);
    
    
        allButtons();
    }
    
    private static void allButtons() {
        panel.setLayout(null);
        window.add(panel);
    
    
        final JButton button[]=new JButton[23];
        for(int i=0;i<button.length;i++){
            button[i] = new JButton();
        }
    
        panel.add(button[0]);
        button[0].setBounds(30, 30, 60, 60);
        final Color[] ColorArray = {Color.WHITE, Color.ORANGE,Color.GREEN,Color.RED,Color.BLUE,Color.YELLOW};
    
        class ButtonListener implements ActionListener {
            private int buttonIndex;
    
            public ButtonListener(int buttonIndex) {
                this.buttonIndex = buttonIndex;
            }
    
            @Override
            public void actionPerformed(ActionEvent e) {
                final int stickerNum = 24;
    
                if(stickerNum <= 3){
                    for(Color i : ColorArray){
                    button[buttonIndex].setBackground(i);
                    cube[Side][0] = 0;
                    }
                }
            }
        }
    
        for(int i = 0; i < button.length; i++) {
            button[i].addActionListener(new ButtonListener(i));
        }
    }