[英]Repainting a JPanel from a JCheckBox ActionListener in another Package
好的,我将尽力解释这一点。 我相当精通Java,但是经过大量搜索之后却找不到合理的解决方案。 可以说我在包A中有一个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();
}
}
在包BI中的另一个类中,有一个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类的重绘。 如果这个问题不清楚,请告诉我,以便我进行修改。 预先谢谢你们,这是我的第一个问题,但是我已经使用你们几年了。
这里的概念似乎有些混乱,让我尝试解释一下。
静态方法与实例方法:类可以具有静态方法和非静态方法。 非静态方法只能在类的实例上调用。 只能在类上调用static(尽管您可以通过包含类实例的变量来调用它们)。
方法可见性:方法可以是私有的,受保护的,受程序包保护的或公共的。 私有方法只能在同一类中调用)。 只能从类或子类中调用protected。 可以从同一包内的类调用受包保护(没有任何限定符)的包。 公众可以在任何地方打电话。
在您的情况下, CheckBoxClass
不在同一包中这一事实与您不能调用DrawGraph.updateGraph()
的事实无关。 updateGraph()
是一个实例方法(非静态),因此您必须有一个实例才能调用它。 现在,如果您知道程序中将只有一个DrawGraph实例,则可以使用单例模式:1) DrawGraph
类中的静态变量已初始化为该类本身的实例。 还有一个返回此类实例的静态方法:
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
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.