2016-12-02 61 views
0

好的,我将尽我所能地尽力解释它。我对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类。如果这个问题不清楚,请让我知道,所以我可以修改它。先谢谢你们,这是我的第一个问题,但我一直在使用你们几年。

回答

0

这里似乎有点混乱的概念,让我试着解释一下。

静态与实例方法: 一个类可以有静态和非静态方法。非静态方法只能在类的一个实例上调用。静态只能在类上调用(尽管可以通过包含类的实例的变量来调用它们)。

方法可见性:一种方法可以是私有的,受保护的,软件包保护的或公共的。私有方法只能从同一个类中调用)。 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 
    } 
+0

非常感谢你,太傻了,我压根没想到使用单例模式。我不得不稍微修改一下你的答案,但仍然是一样的原则。再次感谢。 –