从另一个包中的JCheckBox ActionListener重画一个JPanel
好的,我将尽我所能地尽力解释它。我对Java非常熟练,但经过大量搜索后无法找到合理的解决方案。假设我在包A中有一个JPanel类,它将包含一个将被绘制的图。从另一个包中的JCheckBox ActionListener重画一个JPanel
package A
public class DrawGraph extends JPanel
{
public DrawGraph()
{
}
@Override
public void paintComponent(Graphics g)
{
super.paintComponent(g);
// other stuff
}
public void updateGraph()
{
repaint();
}
}
在包B的内部不同的I类具有JCheckBox的选定应触发图表的重绘在包A.当这个类不初始化DrawGraph类。该课程在其他地方初始化。
package B
public class CheckBoxClass extends JPanel
public CheckBoxClass
{
graphicsCheckBox.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent cb)
{
GUI_Data.graphics = true;
DrawGraph.updateGraph(); // Calls Update Graph function
}
});
}
现在我怎么叫我DrawGraph类updateGraph功能,而无需创建DrawGraph类的新实例?我知道我不能使updateGraph方法成为静态的,因为repaint()不是静态的。我觉得必须有一种方法来做到这一点,而不需要通过定时器或其他复杂而低效的方法进行重新绘制。我是否以错误的方式看待这个问题?基本上我需要一种方法来触发从JCheckBox类actionlistener重绘DrawGraph类。如果这个问题不清楚,请让我知道,所以我可以修改它。先谢谢你们,这是我的第一个问题,但我一直在使用你们几年。
这里似乎有点混乱的概念,让我试着解释一下。
静态与实例方法: 一个类可以有静态和非静态方法。非静态方法只能在类的一个实例上调用。静态只能在类上调用(尽管可以通过包含类的实例的变量来调用它们)。
方法可见性:一种方法可以是私有的,受保护的,软件包保护的或公共的。私有方法只能从同一个类中调用)。 protected只能从类或子类中调用。可以从同一个包中的类调用包保护(没有任何限定符)。公众可以从任何地方调用。
在你的情况下,事实CheckBoxClass
是不是在同一个包无关的事实,你不能叫DrawGraph.updateGraph()
。 updateGraph()
是一个实例方法(非静态),因此您必须有一个实例来调用它。现在,如果您知道程序中将只有一个DrawGraph实例,那么您可以使用单例模式:DrawGraph
类中的 1)具有初始化为类本身实例的静态变量。也有返回这样的实例的静态方法:
public class DrawGraph {
private static DrawGraph singleton = new DrawGraph();
public static getInstance() {
return singleton;
}
}
现在你可以做以下的CheckBoxClass
:
@Override
public void actionPerformed(ActionEvent cb)
{
GUI_Data.graphics = true;
DrawGraph.getInstance().updateGraph(); // Calls Update Graph function
}
非常感谢你,太傻了,我压根没想到使用单例模式。我不得不稍微修改一下你的答案,但仍然是一样的原则。再次感谢。 –