2014-02-18 35 views
0

我有以下揮杆應用程序。問題是我想單擊按鈕操作將新組件添加到Container c。無論何時在構造函數中單獨調用AddGraph()方法,都會添加圖表。但是,如果我在actionPerformed()內部調用它,則不添加圖表。 我試過讓AddGraph()返回圖表對象,然後在actionPerformed()中添加它,但仍然無法工作。它應該是非常基本的東西,但我找不到正確的方法來做到這一點。從構造公共containercJava swing按鈕不會添加新的容器組件

public class MainFrame extends JFrame { 

     ChartPanel chartPanel; 

     public MainFrame(String title) 
     { 
      super(title); 

    //  Set layout manager 
      setLayout(new BorderLayout()); 

    //  Create Swing components 
      JButton button = new JButton("Click me"); 

    //  Add swing components to content pane 
      final Container c = getContentPane(); 

      c.add(button, BorderLayout.SOUTH); 

      AddGraph(c); 

    //  button behaviour here 
      button.addActionListener(new ActionListener() { 

       @Override 
       public void actionPerformed(ActionEvent arg0) { 


        //AddGraph(c); 

       } 

      }); 
     } 

     public void AddGraph(Container c) 
     { 

    . 
    . 
    . 
      chartPanel = new ChartPanel(chart); 
      chartPanel.setPreferredSize(new java.awt.Dimension(500, 270)); 



      c.add(chartPanel, BorderLayout.CENTER); 


     } 

    } 
+0

不應該將組件添加到容器嗎?我沒有看到你在任何地方做這件事。你的'AddGraph'方法應該將容器作爲參數,但是我看到你創建了一個與'MainFrame'構造函數不一樣的新容器。 – Omoro

+0

我已經改變了這一點,加入c作爲參數AddGraph仍然是相同的結果 - 工作時調用的按鈕事件,而不是在裏面調用時工作... – Konstantin

+0

@ user3259222:你試過調用'frame.validate()和frame在'actionPerformed'方法內添加'charPanel'後的.repaint()'? 'JFrame'默認佈局是'BorderLayout'不需要明確設置。如果將組件添加到「JPanel」,然後將此JPanel設置爲「JFrame」的內容窗格,而不是直接將組件添加到頂層容器,這將允許再次使用相同的代碼,另一種觀點。 –

回答

0

製作對象,並添加chartPanel c

public void AddGraph(){ 
    . 
    . 
    . 
    chartPanel = new ChartPanel(chart); 
    chartPanel.setPreferredSize(new java.awt.Dimension(500, 270)); 

    // Container c = getContentPane(); 

    c.add(chartPanel, BorderLayout.CENTER); 
} 
0

您AddGraph應該是這樣的:

public void AddGraph(Container c) 
{ 
    . 
    . 
    chartPanel = new ChartPanel(chart); 
    chartPanel.setPreferredSize(new java.awt.Dimension(500, 270)); 

    c.add(chartPanel, BorderLayout.CENTER); 

} 

然後在構造函數你可以這樣稱呼它:

AddGraph(c); 
+0

我試過了,還沒有工作。結果相同:在構造函數中調用AddGraph(c),在button事件中調用它不起作用。 – Konstantin

+0

如果@nIcEcOw表示不起作用,請嘗試創建一個返回「ChartPanel」的方法,然後使用'setContentPane(chartPanel)'在actionPerformed集內容窗格中創建一個方法。您也可以選擇在構造函數中創建整個ChartPanel對象。 – Omoro