如何使用ActionListener从另一个类更改JPanel颜色?

问题描述 投票:-1回答:1

我在使用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命令将起作用。我想要实现的概念是使用带有单选按钮的“更改颜色”菜单,用户可以将其更改为黑色或蓝色。我知道这可能有些过分,但我们正在努力学习如何对来自不同类的组件进行更改。感谢您的任何帮助!

java swing radio-button jpanel actionlistener
1个回答
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);
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.