2017-04-07 44 views
-1

這是代碼是在JFrame類名稱爲「Timer1.java」和JPanel類名「Timer_UI.java」無法添加多個jpanel(每個jpanel是一個單獨的計時器併發運行),以jframe使用arraylist只有初始jpanel正在增加?

ArrayList<Timer_UI> mul_panels = new ArrayList<Timer_UI>(); 
    public void jButton2ActionPerformed(java.awt.event.ActionEvent evt){ 
    Timer_UI d_timer = new Timer_UI(); 
      mul_panels.add(d_timer); 
      Timer_UI dis_timer = mul_panels.get(i); 
      i++; 
      dis_timer.setBackground(Color.white); 
      dis_timer.setBounds(34, 110, 434, 178); 
      add(dis_timer); 
      height = height + 230; 
      setSize(new Dimension(523,height)); 
    } 

的應用程序的執行

執行的應用程序的。只有一個JPanel的對象是加上再次點擊沒有計時器加入到框架:

https://i.stack.imgur.com/2SxUC.jpg

+1

請考慮讓您的標題更具體,懷疑任何人都會找到答案通過搜索引擎提問。 –

+2

請向我們展示您最好的[mcve]嘗試,以便我們可以編譯,運行和演示問題。請理解我們不希望看到您的整個程序,特別是如果它長於60行,而是應該將代碼壓縮到仍然編譯和運行的最小位,沒有額外的代碼與您的問題無關,但仍然表明你的問題。 –

+0

另外,你也明白JFrame(實際上,它的contentPane)默認使用BorderLayout,如果你不改變它,只會添加最後一個JPanel(沒有指定在哪裏),對嗎? –

回答

1

不要使用的setBounds()來設置組件的大小。

Swing設計用於佈局管理器。

如果您想要水平添加更多計時器面板,則需要使用適當的佈局管理器。也許是BoxLayoutGridLayout

開始通過讀取上Layout Manager Swing的教程部分獲取更多信息和工作實例

所以基本邏輯可能是這樣的:現在,當你想創建一個新的計時器

JPanel topPanel = new JPanel(new BorderLayout()); 
topPanel.add(label, BorderLayout.PAGE_START); 
topPanel.add(button1, BorderLayout.LINE_START); 
topPanel.add(button2, BorderLayout.LINE_END); 

Box timerPanel = new Box.createVerticalBox(); 

frame.add(topPanel, BorderLayout.PAGE_START); 
frame.add(timerPanel, BorderLayout.CENTER); 

ActionListner代碼會是這樣的:

Timer_UI dis_timer = mul_panels.get(i); 
dis_timer.setMaximumSize(dis_timer.getPreferredSize()); 
timerPanel.add(dis_timer); 
timerPanel.revalidate(); 
timerPanel.repaint();