2017-04-07 17 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();