Java JPanel中的JPanel

Java JPanel中的JPanel,java,swing,layout,jpanel,mixing,Java,Swing,Layout,Jpanel,Mixing,我对Java JPanels有一个问题。我想把2个不同布局的JPanel放到一个同样有布局的JPanel中。甚至可以让它工作吗 BibP() setLayout(new GridLayout(5, 1)); //The big JPanel add(new A(), new FlowLayout(4)); add(new B(), new GridLayout(7,2)); A和B都是作为JPanel扩展的类,无论我更改了什么或注释了什么,B总是显示在一行中。 我在A中添加了4

我对Java JPanels有一个问题。我想把2个不同布局的JPanel放到一个同样有布局的JPanel中。甚至可以让它工作吗

    BibP()
setLayout(new GridLayout(5, 1)); //The big JPanel
add(new A(), new FlowLayout(4));
add(new B(), new GridLayout(7,2));    
A和B都是作为JPanel扩展的类,无论我更改了什么或注释了什么,B总是显示在一行中。 我在A中添加了4个元素,在B中添加了14个元素(JLabels和JTextAreas),其中没有多少代码,只有添加和一些计算

问题可能是在JFrame中,我试图将大JPanel放在其中

    JFrame.this.add(new BigP(),BorderLayout.CENTER);    
编辑:

谢谢你的帮助

几次尝试后:

如果我用这个:

    add(new B(), new GridLayout(7,2));
当我打印布局时,我在B中得到:

java.awt.FlowLayout[hgap=5,vgap=5,align=center]

如果我在B中设置布局:

    setLayout(new GridLayout(7, 2));
这些信息是正确的:

GridLayout[hgap=0,vgap=0,rows=7,cols=2]

但是只有2个区域是可行的,其中应该有14个元素

甚至可以让它工作吗

    BibP()
setLayout(new GridLayout(5, 1)); //The big JPanel
add(new A(), new FlowLayout(4));
add(new B(), new GridLayout(7,2));    
是的,它通常被称为复合布局

您遇到的问题是,您正试图将
布局作为约束提供给当前的容器布局管理器(在您的情况下,幸运的是它没有期望任何约束)

相反,将布局管理器直接提供给子面板…类似于

setLayout(new GridLayout(5, 1)); //The big JPanel

JPanel a = new JPanel(new FlowLayout(4));
JPanel b = new JPanel(new GridLayout(7,2));
add(a);
add(b); 
查看更多详细信息

使用示例更新

简单的可运行示例,使用标签作为占位符

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.LineBorder;

public class ExampleLayout {

  public static void main(String[] args) {
    new ExampleLayout();
  }

  public ExampleLayout() {
    EventQueue.invokeLater(new Runnable() {
      @Override
      public void run() {
        try {
          UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
          ex.printStackTrace();
        }

        JPanel mainPane = new JPanel(new GridLayout(5, 1));
        mainPane.add(new APanel());
        mainPane.add(new BPanel());

        JFrame frame = new JFrame("Testing");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(mainPane);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
      }
    });
  }

  public class APanel extends JPanel {

    public APanel() {
      setLayout(new FlowLayout(4));
      for (int index = 0; index < 4; index++) {
        add(new JLabel(Integer.toString(index)));
      }
      setBorder(new LineBorder(Color.RED));
    }

  }

  public class BPanel extends JPanel {

    public BPanel() {
      setLayout(new GridLayout(7, 2));
      for (int index = 0; index < 14; index++) {
        add(new JLabel(Integer.toString(index)));
      }
      setBorder(new LineBorder(Color.BLUE));
    }

  }

}

导入java.awt.Color;
导入java.awt.EventQueue;
导入java.awt.FlowLayout;
导入java.awt.GridLayout;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
导入javax.swing.border.LineBorder;
公共类示例布局{
公共静态void main(字符串[]args){
新示例布局();
}
公共示例布局(){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
例如printStackTrace();
}
JPanel主窗格=新的JPanel(新的网格布局(5,1));
添加(新的APanel());
添加(新的BPanel());
JFrame=新JFrame(“测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(主窗格);
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
公共类APanel扩展了JPanel{
公共公寓{
setLayout(新的FlowLayout(4));
对于(int-index=0;index<4;index++){
添加(新JLabel(Integer.toString(index));
}
设置顺序(新的线边框(颜色为红色));
}
}
公共类BPanel扩展了JPanel{
公共BPanel(){
setLayout(新网格布局(7,2));
对于(int-index=0;index<14;index++){
添加(新JLabel(Integer.toString(index));
}
设置顺序(新线条边框(颜色为蓝色));
}
}
}
这个
setboorder(新的空序(3,-160,0,0))看起来也不对<代码>清空顺序
不应具有负值

 Is it even possible to make it work?
是的,这是可能的。在下面的行中

JFrame.this.add(new BigP(),BorderLayout.CENTER);  
我建议你这样做

mainFrame.getContentPane.add(new BigP());
在此之前设置主机的布局

mainFrame.setLayout(new GridLayout(5, 1));

代码似乎缺少关键部分。如果我在精神上完成了,那么一切看起来都很好。请确保您输入的内容准确无误。很明显,它有问题。为了更快地获得更好的帮助,请发布一个。很有趣<默认情况下,code>JFrame
使用
BorderLayout
。如果不向布局提供位置约束,它默认使用
Center
,因此
JFrame.this.add(new BigP(),BorderLayout.Center)
mainFrame.getContentPane.add(新的BigP())将是相同的…直到您更改布局管理器;)我认为问题不在于JFrame,因为如果我这样评论:setLayout(newgridlayout(1,1));新的空序(3,-160,0,0))//添加(新A(),新FlowLayout(4));添加(新B(),新GridLayout(7,2));B仍然显示在一行中。这是一样的,B仍然显示在一行中。我输入了这个:A=新的A();增加(a,新网格布局(7,2));如果我在A中设置布局,我只返回2个文本区域,而不是我想要的14个元素。