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