这是我的代码看起来像的一个简化版本:
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然后通过那里访问它会更好吗?
答案 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)
您正面临设计问题;一般而言,这种情况需要进行更多调查,以了解如何最终实现清洁和可维护的设计。 但是,对于您要报告的具体问题,我会:
ButtonListener
的构造函数,该构造函数接收可以访问所需信息的参数(即ColorFactory
),以便您可以在ButtonListener
本身初始化字段changeColor
中创建方法ColorFactory
。此方法实际应用颜色更改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 */);
}
}