簡體   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