Java 如何向JPanel添加多个JComponent?

Java 如何向JPanel添加多个JComponent?,java,swing,jpanel,jcomponent,Java,Swing,Jpanel,Jcomponent,我试图向一个JPanel添加多个组件,但只有最近添加的组件显示出来 问题似乎是布局一次只能处理一个组件,但我不知道如何实际修复它。我曾尝试将组件添加到一个单独的面板,然后再将其添加到主面板,但我尝试了几种不同的布局,但都无济于事 以下是相关代码,我目前正试图在面板上获得两个扩展JComponent的TextRect: public class ProjectView extends JFrame implements IProjectView, Observer { private IProj

我试图向一个JPanel添加多个组件,但只有最近添加的组件显示出来

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

以下是相关代码,我目前正试图在面板上获得两个扩展JComponent的TextRect:

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();
}
公共类ProjectView扩展JFrame实现IProjectView,Observer{
私有项目模型;
专用项目控制器;
私人JPanel小组;
公共项目视图(IProjectModel模型){
this.model=模型;
((可观察的)this.model);
控制器=新项目控制器(this.model,this);
addWindowListener(控制器);
getContentPane().setLayout(新的BorderLayout());
populateMenuBar();
panel=newjpanel(newborderlayout());
getContentPane().add(面板);
包装();
setMinimumSize(getSize());
setExtendedState(JFrame.MAXIMIZED_两者);
}
公共void generateUML(ArrayList内容){
添加(新的TextRect(content.get(0,10,10));
add(newtextrect(content.get(0),100100));
panel.revalidate();
}
任何帮助都将不胜感激

编辑:

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

private void generateUML(){
ArrayList类=新的ArrayList();
classes=model.getClasses();
ArrayList allClasses=新的ArrayList();
对于(int i=0;i
您正在为面板使用BorderLayout。add方法将添加到面板中心,并将扩展到北、南、东和西未使用的大小。可能您正在寻找仅将组件相邻放置的FlowLayout。
只有一个组件可以出现在BorderLayout的任何部分中。因此,如果将两个组件添加到中心,则只有最后一个组件可见。

您正在为面板使用BorderLayout。添加方法将添加到面板的中心,并将扩展到北、南、东和西未使用的大小。也许您正在寻找仅将组件相邻放置的FlowLayout。 BorderLayout的任何部分中只能显示一个组件。因此,如果在中间添加两个组件,则只能看到最后一个组件。

尝试此操作

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.repaint()
如果设置BorderLayout,则应使用其属性

另一个选项是网格布局

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));
试试这个

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.repaint()
如果设置BorderLayout,则应使用其属性

另一个选项是网格布局

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));

感谢您的回复,不幸的是,当我将其更改为FlowLayout时,allWoops没有显示任何代码,无法在此处添加所有代码,我将将其编辑到主要问题感谢您的回复,不幸的是,当我将其更改为FlowLayout时,allWoops没有显示任何代码,无法在此处添加所有代码,我将其编辑到主要问题感谢您的建议,看起来只有放在中间的组件在显示。因为我希望根据源代码中的类数动态添加组件,所以指定面板的哪个部分来添加每个组件似乎也不可行unfortunately@user3080715,
看起来只有放置在中间的组件正在显示
——这可能是因为TextRect组件没有覆盖getPreferredSize()方法返回一个合适的大小。GridLayout可以工作,因为它忽略了首选的大小。啊,对了,谢谢你提供的信息!就像我说的,我在Swing方面没有太多的经验,但我下次在项目中使用它时一定会记住这一点!谢谢你的建议,看起来只有放在中间的组件在显示。S因为我希望根据源代码中的类数动态添加组件,所以指定面板的哪个部分来添加每个组件似乎也不可行unfortunately@user3080715,
看起来只有放在中间的组件显示了
——这可能是因为您的TextRect组件没有显示t覆盖getPreferredSize()的值方法返回一个合适的大小。GridLayout可以工作,因为它忽略了首选的大小。啊,对了,谢谢你提供的信息!就像我说的,我在Swing方面没有太多的经验,但我下次在项目中使用它时一定会记住这一点!
当我将其更改为FlowLayout时,看起来什么都不会显示出来。
-这是可能的这可能是因为TextRect组件没有覆盖getPreferredSize()方法以返回适当的大小。
当我将其更改为FlowLayout时,似乎什么都没有显示。
-这可能是因为TextRect组件没有覆盖getPreferredSize()方法以返回适当的大小。