繁体   English   中英

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

[英]How to access an object within another class (Java)

这是我的代码的简化版本:

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然后通过那里进行访问会更好吗?

对于初学者,您需要将JPanel设置为ColorFactory中的一个字段,因此退出buildTopPanel()时对它的引用不会消失。 保存对它的引用后,便有两种选择。 从设计的角度来看,错误的选择是公开它,例如:

JPanel getTopPanel(){
    return topPanel;
}

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

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

您正面临设计问题; 通常,这种情况需要更多调查,以了解如何最终获得一个干净且可维护的设计。 但是,对于您要报告的特定问题,我将:

  1. 创建一个ButtonListener的构造函数,该构造函数接收一个可以访问所需信息的参数(即ColorFactory ),以便可以在ButtonListener本身中初始化一个字段
  2. ColorFactory创建方法changeColor 这种方法实际上会应用颜色变化
  3. ButtonListener ,调用changeColor场上,即参照ColorFactory

您应该将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 */);
    }
}

暂无
暂无

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

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