繁体   English   中英

从另一个程序包中的JCheckBox ActionListener重绘JPanel

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM