通过循环添加JPanel

时间:2013-07-12 17:59:43

标签: java swing loops jpanel grid-layout

让它发挥作用!谢谢你们!
代码如下。我使用BoxLayout,因为我认为将问题叠加在另一个上面是理想的,但现在我遇到布局问题......当我堆叠几个问题时,问题面板开始重叠。有什么想法吗?

What I wanted...

            panels1 = new MultipleChoice[5];
    setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
    for(int i=0; i<4; i++){
        panels1[i]= new MultipleChoice();
        panels1[i].setAlignmentX(CENTER_ALIGNMENT);
        add(panels1[i]);


    }
    setVisible(true);

我正在设计一个在线测试小程序。
测试有多种选择和真/假问题。为了设置测试,我创建了两个JPanel类,一个用于多选题,一个用于真/假问题。因此,当创建测试时,我将根据非固定数量的问题动态地将这些面板添加到JPanel容器中。

首先,如何动态地将新面板添加到面板?我想过要声明一个JPanel类型的数组。我使用for循环创建并添加了此面板类的对象:

MultitipleChoicePanel[] PanelArray;

for (...){
   PanelArray[i] =  new MultipleChoicePanel();
   containerpanel.add(PanelArray[i]);
   }

我不知道这在技术上是否可行。
这是我第一次使用Swing,我试过这样做,但很明显它没有用。
有没有人知道如何正确地动态添加这些面板?

其次,哪个布局管理器最适合容器面板,以便适合在前一个面板下添加的每个新面板?我想到动态设置一列GridLayout并在添加面板时添加行。但我一直在努力动态修改波动。
有什么建议吗?

非常感谢你的帮助!

4 个答案:

答案 0 :(得分:4)

JPanel默认布局为FlowLayout,默认情况下会将每个组件添加到右侧,以便它适合您的问题。

您也可能对swingx HorizontalLayout感兴趣。

示例:

//in some place
 JPanel myBigPanel = new JPanel();
 myBigPanel.setLayout(new HorizontalLayout()); // swingx api

List<MultitipleChoicePanel> panelList = new ArrayList<>();
// panelList.add(new MultipleChoicePanel()).. .n times

for(MultipleChoicePanel mp : panelList){
 myBigPanel.add(mp);
}

myBigPanel.revalidate(); // revalidate should call repaint but who knows
myBigPanel.repaint();

How to use various Layout Managers

答案 1 :(得分:3)

  

如何正确动态添加这些面板?

将组件添加到可见的GUI后,您需要执行以下操作:

panel.add(...);
panel.revalidate();
panel.repaint();

答案 2 :(得分:1)

  

“然后使用for循环添加此面板类的对象:.....我不知道它是否在技术上可行”

就一系列面板而言,我会用一个arraylist来做,并按照你的方式进行。

import java.util.ArrayList;

ArrayList<MultipleChoicePanel> array = new ArrayList<MultipleChoicePanel>();
for(...){
     array.add(new MultipleChoicePanel());
     containerPanel.add(array.get(i));
}

答案 3 :(得分:1)

import java.awt.*;

导入javax.swing。*;

公共类JavaSwing扩展了JApplet {

public void init(){
    Container content = getContentPane();

    JScrollPane pane= new JScrollPane();
    JPanel panel = new JPanel();
    panel.setLayout(new BoxLayout(panel,BoxLayout.Y_AXIS));    

    panel.add(addPanel("title121"));
    panel.add(addPanel("title112"));
    panel.add(addPanel("title12"));
    panel.add(addPanel("title11"));
    pane.getViewport().add(panel);

    content.add(pane); 
}

public static JPanel addPanel(String title){
    JPanel panel = new JPanel();
    panel.add(new JButton(title));
    return panel;
}

}