繁体   English   中英

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

[英]How to change JPanel color with ActionListener from another class?

我在使用另一个类的单选按钮的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过正,但是我们正在尝试学习如何对不同类中的组件进行更改。 感谢您的任何帮助!

不好:

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);
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM