从另一个包中的 JCheckBox ActionListener 重新绘制 JPanel
Repainting a JPanel from a JCheckBox ActionListener in another Package
好的,我将尽力解释这一点。我相当精通Java,但经过广泛搜索后无法找到合理的解决方案。假设我在包 A 中有一个 JPanel class,它将包含一个将要绘制的图形。
package A
public class DrawGraph extends JPanel
{
public DrawGraph()
{
}
@Override
public void paintComponent(Graphics g)
{
super.paintComponent(g);
// other stuff
}
public void updateGraph()
{
repaint();
}
}
In a different class inside package B I have a JCheckBox that when selected should trigger a repaint of the graph in package A. This class does not initialize the DrawGraph class. class 在别处初始化。
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 class 中调用 updateGraph 函数而不必创建 DrawGraph class 的新实例?我知道我不能使 updateGraph 方法静态化,因为 repaint() 不是静态的。我觉得必须有一种方法可以做到这一点,而无需通过计时器或其他一些复杂且低效的方法重新绘制。我是否以错误的方式看待这个问题?基本上我需要一种方法来从 JCheckBox class 动作监听器触发 DrawGraph class 的重绘。如果这个问题不清楚,请告诉我,以便我进行修改。提前谢谢你们,这是我的第一个问题,但我已经使用你们好几年了。
这里好像概念有点混乱,我来解释一下。
静态与实例方法:
class 可以有静态和非静态方法。非静态方法只能在 class 的实例上调用。 static 只能在 class 上调用(尽管您可以通过包含 class 实例的变量调用它们)。
方法可见性:方法可以是私有的、受保护的、受包保护的或 public。私有方法只能从同一个 class) 中调用。 protected 只能从 class 或 subclass 中调用。包保护(没有任何限定符)可以从同一包中的 classes 调用。 public 可以从任何地方调用。
在你的例子中,CheckBoxClass
不在同一个包中的事实与你不能调用 DrawGraph.updateGraph()
的事实无关。 updateGraph()
是一个实例方法(非静态),因此你必须有一个实例来调用它。现在,如果您知道您的程序中将只有一个 DrawGraph 实例,那么您可以使用单例模式:
1) 在 DrawGraph
class 中有一个静态变量初始化为 class 本身的一个实例。还有一个静态方法 returns 这样的实例:
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
}
好的,我将尽力解释这一点。我相当精通Java,但经过广泛搜索后无法找到合理的解决方案。假设我在包 A 中有一个 JPanel class,它将包含一个将要绘制的图形。
package A
public class DrawGraph extends JPanel
{
public DrawGraph()
{
}
@Override
public void paintComponent(Graphics g)
{
super.paintComponent(g);
// other stuff
}
public void updateGraph()
{
repaint();
}
}
In a different class inside package B I have a JCheckBox that when selected should trigger a repaint of the graph in package A. This class does not initialize the DrawGraph class. class 在别处初始化。
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 class 中调用 updateGraph 函数而不必创建 DrawGraph class 的新实例?我知道我不能使 updateGraph 方法静态化,因为 repaint() 不是静态的。我觉得必须有一种方法可以做到这一点,而无需通过计时器或其他一些复杂且低效的方法重新绘制。我是否以错误的方式看待这个问题?基本上我需要一种方法来从 JCheckBox class 动作监听器触发 DrawGraph class 的重绘。如果这个问题不清楚,请告诉我,以便我进行修改。提前谢谢你们,这是我的第一个问题,但我已经使用你们好几年了。
这里好像概念有点混乱,我来解释一下。
静态与实例方法: class 可以有静态和非静态方法。非静态方法只能在 class 的实例上调用。 static 只能在 class 上调用(尽管您可以通过包含 class 实例的变量调用它们)。
方法可见性:方法可以是私有的、受保护的、受包保护的或 public。私有方法只能从同一个 class) 中调用。 protected 只能从 class 或 subclass 中调用。包保护(没有任何限定符)可以从同一包中的 classes 调用。 public 可以从任何地方调用。
在你的例子中,CheckBoxClass
不在同一个包中的事实与你不能调用 DrawGraph.updateGraph()
的事实无关。 updateGraph()
是一个实例方法(非静态),因此你必须有一个实例来调用它。现在,如果您知道您的程序中将只有一个 DrawGraph 实例,那么您可以使用单例模式:
1) 在 DrawGraph
class 中有一个静态变量初始化为 class 本身的一个实例。还有一个静态方法 returns 这样的实例:
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
}