如何使用 GridBagLayout 创建 3 个 JPanel,一个放在另一个之上,高度可变

How to use the GridBagLayout to create 3 JPanels one on top of the other, of variable height

我想在 java 中编写一个简单的文本编辑器。

我整理了我的布局并得出结论,我基本上需要 3 个 JPanel,一个放在另一个之上。第一个和第二个高度将非常短,因为它们分别是菜单栏和一个包含 2 个 JLabel 的 JPanel。 中间的那个高度应该是最高的,因为所有的文字都会被包含在里面。

我想我需要使用 GridBagLayout 但这不起作用,我需要它们占用大的比小的多 10 倍。所有这些都将使用 JFrame 提供的尽可能多的宽度。

到目前为止代码片段是-

GridBagConstraints gbc = new GridBagConstraints
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 0;
gbc.gridy = 0;
mainFrame.add(upperGrid, gbc);
gbc.gridx = 0;
gbc.gridy = 1;
gbc.gridheight = 10;
mainFrame.add(upperGrid, gbc);
gbc.gridx = 0;
gbc.gridy = 11;
mainFrame.add(upperGrid, GBC);

我得到的结果是这个-

我建议你放弃 GridLayout 的想法。我会改为执行以下操作:

  1. 为您的菜单栏使用 JMenuBar (https://docs.oracle.com/javase/tutorial/uiswing/components/menu.html)

  2. 使用边框布局:

    JFrame frame = new JFrame();
    JPanel topPanel = new JPanel();
    topPanel.setLayout(new FlowLayout());
    topPanel.add(new JLabel("Label 1"));
    topPanel.add(new JLabel("Label 2"));
    frame.add(topPanel, BorderLayout.NORTH);
    JPanel bigPanel = new JPanel();
    frame.add(bigPanel, BorderLayout.CENTER);
    

例如,当您需要安排包含大量文本字段的对话框时,您可以使用 GridLayout。但是对于这个 "rougher" 的东西,BorderLayout 更好,也因为它可能更快。 (大概吧,我也不确定)

编辑:如果您绝对必须使用 GridBagLayout,那么您可以执行以下操作:

JPanel panel = new JPanel();
GridBagLayout layout = new GridBagLayout();
layout.columnWidths = new int[] { 0, 0 };
layout.rowHeights = new int[] { 0, 0, 0, 0 };
layout.columnWeights = new double[] { 1.0, Double.MIN_VALUE };
layout.rowWeights = new double[] { 0.0, 0.0, 1.0, Double.MIN_VALUE };
panel.setLayout(layout);

JPanel menuBar = new JPanel();
GridBagConstraints contraints = new GridBagConstraints();
contraints.fill = GridBagConstraints.BOTH;
contraints.gridx = 0;
contraints.gridy = 0;
panel.add(menuBar, contraints);

JPanel panelForLabels = new JPanel();
contraints = new GridBagConstraints();
contraints.fill = GridBagConstraints.BOTH;
contraints.gridx = 0;
contraints.gridy = 1;
panel.add(panelForLabels, contraints);

JPanel bigPanel = new JPanel();
contraints = new GridBagConstraints();
contraints.fill = GridBagConstraints.BOTH;
contraints.gridx = 0;
contraints.gridy = 2;
panel.add(bigPanel, contraints);