如何通过另一个类的ActionListener更改JPanel颜色?

时间:2019-03-15 17:20:26

标签: java swing radio-button jpanel actionlistener

我在使用一个类的ActionListener更改另一个类中的单选按钮时,在更改Jpanel(mainPanel)的颜色时遇到问题。我将mainPanel的默认颜色设置为黑色。

基本上,我的第一堂课有一个setMainPanel方法:

public class MainBoard extends JFrame{

    public void setMainPanel(Color c){
        mainPanel.setBackground(c);
    }
}

在第二堂课中,我的动作监听器为:

private class MenuHandler implements ActionListener{
    public void actionPerformed(ActionEvent e){
        if(e.getSource() == exit) {
            System.exit(0);
        }else if(e.getSource() == blueBackground) {
            MainBoard mb = new MainBoard();
            mb.setMainPanel(Color.BLUE);
        }
    }
}

如果我在菜单中单击“退出”,则我的System.exit命令将起作用。我试图实现的概念是拥有一个带有单选按钮的“更改颜色”菜单,用户可以在其中更改为黑色或蓝色。我知道这可能是矫kill过正,但是我们正在尝试学习如何对不同类中的组件进行更改。 谢谢您的帮助!

1 个答案:

答案 0 :(得分:1)

不好:

MainBoard mb = new MainBoard();  // this is not the currently displayed MainBoard
mb.setMainPanel(Color.BLUE);

这表示魔术思维的一个常见Java新手错误,您认为更改类的对象的状态将魔术地更改同一类的另一个对象的状态,但这不是Java的工作原理。您需要在对当前显示的或活动的MainBoard实例的引用上调用setMainPanel(...)方法,而不是在此方法中创建的且永远不会显示的某些随机的新的和完全不同的MainBoard对象。 。

因此将适当的引用传递到侦听器中,也许使用类似以下内容的方法:

private class MenuHandler implements ActionListener {
    MainBoard mainBoard;

    MenuHandler(MainBoard mainBoard) {
        this.mainBoard = mainBoard;
    }

    public void actionPerformed(ActionEvent e){
        if(e.getSource() == exit) {
            System.exit(0);
        }else if(e.getSource() == blueBackground) {
            // MainBoard mb = new MainBoard();
            mainBoard.setMainPanel(Color.BLUE);
        }
    }
}