0

我对 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 总是出现在 1 行中。我在 A 中添加了 4 个元素,在 B 中添加了 14 个元素(JLabels 和 JTextAreas),其中没有太多代码,只有添加和一些计算。

问题可能出在我试图放置大 JPanel 的 JFrame 中。

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

编辑:

    public class BigP extends JPanel{
//Labels and TextAres

public class A extends JPanel{
    public A(){
        setBorder(new EmptyBorder(0, -50, 0, 0));
        //get date and add to textareas
        //add the label and textareas
}
}

public class B extends JPanel{
    public B (){
        setBorder(new EmptyBorder(0, -50, 0, 0));
        setBackground(Color.red);
        //colum longs for text areas less then 5
        //add labels and textareas
    }
}

public BigP(){
    setLayout(new GridLayout(5, 1));
    setBorder(new EmptyBorder(3,-160,0,0));

    add(new A(), new FlowLayout(4));
    add(new B(), new GridLayout(7,2));
}
}    

感谢您的帮助。

经过几次尝试:

如果我用这个:

    add(new B(), new GridLayout(7,2));

当我打印布局时,我在 B 中得到了这个:

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

如果我在 B 中设置布局:

    setLayout(new GridLayout(7, 2));

信息正确:

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

但是只有 2 个可见的 JTextAreas 应该是 14 个元素。

4

2 回答 2

1

甚至有可能让它工作吗?

是的,它通常被称为复合布局。

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

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

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

  }

}

setBorder(new EmptyBorder(3,-160,0,0));看起来也是不对的。 EmptyBorder永远不应该有负值

于 2013-08-13T06:55:34.890 回答
0
 Is it even possible to make it work?

是的,可以这样做。在下一行

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

我建议做

mainFrame.getContentPane.add(new BigP());

并在此之前设置 mainFrame 的布局

mainFrame.setLayout(new GridLayout(5, 1));
于 2013-08-13T06:57:49.973 回答