如何访问另一个类中的对象(Java)

时间:2015-02-21 17:26:15

标签: java swing

这是我的代码看起来像的一个简化版本:

public class ColorFactory extends JFrame {
            public ColorFactory(){
                buildTopPanel();
            }

            public void buildTopPanel(){
            JPanel topPanel = new JPanel();
            this.add(topPanel, BorderLayout.NORTH);
            }

}

正如您所看到的,我有一个方法在调用时创建一个新的JPanel对象。如何从另一个类访问该特定的JPanel对象?我有一个按钮监听器类,我想从ColorFactory类外部更改JPanel的颜色。此代码紧跟在ColorFactory类之后。

public class ButtonListener implements ActionListener{
     public void actionPerformed(ActionEvent e) {
           //Change JPanel color here. 
     }
}

在ColorFactory构造函数中实例化JPanel然后通过那里访问它会更好吗?

3 个答案:

答案 0 :(得分:1)

对于初学者,您需要将JPanel设置为ColorFactory中的一个字段,因此当您退出buildTopPanel()时,对它的引用不会消失。一旦你保存了它的引用,那么你有几个选择。从设计的角度来看,糟糕的选择是揭露它,例如:

JPanel getTopPanel(){
    return topPanel;
}

更好的选择是让你的动作监听器向ColorFactory发送一条消息,说“respondToButton(Color newColor)”,让ColorFactory决定更改topPanel的颜色......例如:

public void respondToButton(Color newColor){     
    topPanel.setBackground(newColor);
}

答案 1 :(得分:0)

您正面临设计问题;一般而言,这种情况需要进行更多调查,以了解如何最终实现清洁和可维护的设计。 但是,对于您要报告的具体问题,我会:

  1. 创建ButtonListener的构造函数,该构造函数接收可以访问所需信息的参数(即ColorFactory),以便您可以在ButtonListener本身初始化字段
  2. changeColor中创建方法ColorFactory。此方法实际应用颜色更改
  3. ButtonListener中,在字段上调用changeColor,即引用ColorFactory

答案 2 :(得分:0)

你应该让JPanel成为这个类的一个字段:

public class ColorFactory extends JFrame {

        JPanel topPanel;


        public ColorFactory(){
            buildTopPanel();
        }

        public void buildTopPanel(){
            topPanel = new JPanel();
            this.add(topPanel, BorderLayout.NORTH);
        }

        public void changeColor(Color color) {
            //color changing code here
        }


}

现在您可以从另一个类获取JPanel。 您现在要做的就是将ColorFactory放入Button监听器:

public class ButtonListener implements ActionListener{

    ColorFactory colorFactory;
    public ButtonListener(ColorFactory colorFactory) {
        this.colorFactory = colorFactory;
    }

    public void actionPerformed(ActionEvent e) {
           colorFactory.changeColor(/* color here */);
    }
}