2015-03-13 32 views
0

我的主要類擴展JFrame的和具有包含圖形組件一個JPanel,先前我有以下代碼:更新圖形中的JPanel當按下按鈕

public class StartGUI extends JFrame implements ActionListener { 

    public StartGUI { 

    graphArea = new JPanel() { 
     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      drawNetwork(myNetwork, this, g); 
       } 
}; 

      add(graphArea); 
     } 

然而現在我希望改變圖形區域來顯示只有在按下JButton之後,我將如何移動此JPanel以更新actionPerformed方法中的drawNetwork?

public void actionPerformed(ActionEvent e) { 
    if(e.getSource() == readButton) { 
     graphArea = new JPanel() { 
      public void paintComponent(Graphics g) { 
       super.paintComponent(g); 
       drawNetwork(myNetwork, this, g); 

      } 
     }; 
    } 

上面似乎沒有工作,我會如何解決這個問題?

+0

難道你不能只是創建graphArea並使其變成可切換的。在actionPerformed()中調用graphArea.setVisible(true) – StanislavL 2015-03-13 12:46:29

+0

不,因爲這是對我的代碼的簡化。真正的按鈕會提示一個文件選擇器,它會更改顯示哪個圖形。 – user3371750 2015-03-13 12:47:37

回答

2

正如我從你的評論中所理解的那樣,你只需要分開模型(myNetwork)和視圖(graphArea)即可。

創建並添加graphArea但

 public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      if (myNetwork!=null) { 
       drawNetwork(myNetwork, this, g); 
      } 
     } 

Initilly網絡爲空(也可能是一些將IsInitialized()檢查)。只要選擇文件並創建網絡,只需調用graphArea .repaint()以反映模型更改。

0

您創建新的graphArea JPanel,但不要將其添加到任何容器。在您的舊代碼中,您有一個呼叫add(graphArea);,新代碼中缺少該代碼。

+0

不幸的是,這不起作用,我真的希望能夠在不創建新的JPanel的情況下簡單地更新paintComponent。 – user3371750 2015-03-13 12:48:26

+0

您不必每次都創建新的面板。事實上,你不應該這樣做。只要將引用保留爲類中的字段並在偵聽器中使用它。 – 2015-03-13 12:51:47