2016-12-02 95 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

非常感謝你,太傻了,我壓根沒想到使用單例模式。我不得不稍微修改一下你的答案,但仍然是一樣的原則。再次感謝。 –