如何将多个JComponents添加到JPanel?

时间:2013-12-08 20:31:29

标签: java swing jpanel jcomponent

我正在尝试向JPanel添加多个组件,但只显示最近添加的组件。

似乎问题是布局一次只能处理1个组件,但我对如何实际修复它感到茫然。我已经尝试将组件添加到单独的面板,然后将其添加到主面板,我尝试了几种不同的布局无济于事。

这是相关代码,我目前正在尝试在面板上获得两个扩展JComponent的TextRects:

public class ProjectView extends JFrame implements IProjectView, Observer {

private IProjectModel model;
private ProjectController controller;
private JPanel panel;

public ProjectView(IProjectModel model){
    this.model = model;
    ((Observable) this.model).addObserver(this);

    controller = new ProjectController(this.model, this);

    addWindowListener(controller);
    getContentPane().setLayout(new BorderLayout());

    populateMenuBar();

    panel = new JPanel(new BorderLayout());

    getContentPane().add(panel);
    pack();
    setMinimumSize(getSize());

    setExtendedState(JFrame.MAXIMIZED_BOTH);
}

public void generateUML(ArrayList<ArrayList<String>> content){
    panel.add(new TextRect(content.get(0), 10, 10));
    panel.add(new TextRect(content.get(0), 100, 100));

    panel.revalidate();
}

任何帮助都将不胜感激。

编辑:

当用户按下“生成UML”按钮时,从控制器中的ActionListener调用generateUML:

 private void generateUML(){
    ArrayList<IClassModel> classes = new ArrayList<IClassModel>();
    classes = model.getClasses();
    ArrayList<ArrayList<String>> allClasses = new ArrayList<ArrayList<String>>         ();
    for(int i = 0 ; i < classes.size() ; i++){
        classContent = new ArrayList<String>();
        classContent.add(classes.get(i).getClassName());
        classContent.addAll(classes.get(i).getMethodNames());
        classContent.addAll(classes.get(i).getObjectClasses());
        allClasses.add(classContent);
    }

    System.out.println("1: " + allClasses.get(0));
    System.out.println("2: " + allClasses.get(1));
    view.generateUML(allClasses);
}

2 个答案:

答案 0 :(得分:1)

试试这个

panel.add(new TextRect(content.get(0), 10, 10), BorderLayout.SOUTH);
panel.add(new TextRect(content.get(0), 100, 100), BorderLayout.CENTER);

panel.revalidate();
panel.reapint()

如果设置BorderLayout,则应使用其属性。此外,在调用revalidate()之后,您应该调用repaint();

另一个选项是GridLayout

panel = new JPanel(new GridLayout(1, 2)); // or 2, 1 depending if you want them 
                                          // laid out vertically or horizontally

panel.add(new TextRect(content.get(0), 10, 10));
panel.add(new TextRect(content.get(0), 100, 100));

答案 1 :(得分:0)

您正在使用BorderLayout面板。 add方法将添加到面板的中心,并将扩展北,南,东和西没有用完的大小。也许您正在寻找只将组件放在一起的FlowLayout。 BorderLayout的任何部分中只能出现一个组件。因此,如果向中心添加两个组件,则只有最后一个组件可见。