从另一个包中的 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
    }