0

我正在尝试执行以下操作,但不确定要使用哪种类型的 Java 布局。

我想要一个JFrame单面板totalPaneltotalPanel应该包含两个面板,它们是我编写的自定义类,PanelA以及 PanelB。PanelA从高度 200PanelB开始,从高度 400 开始。当用户扩展窗口或调整窗口大小时,只PanelB应增加高度,但两个面板都可以增加宽度。

我该如何设置?我尝试使用 BorderLayout 但“North”的高度总是太小。我曾尝试使用 BoxLayout,但两者PanelAPanelB高度始终相同。

4

4 回答 4

4

考虑让 totalPanel 使用 BorderLayout。将 PanelA 添加到 BorderLayout.PAGE_START 位置,将 PanelB 添加到 BorderLayout.CENTER 位置。

有关布局管理器的更多信息,请查看教程:课程:在容器中布局组件

编辑:我看到您使用了 BorderLayout,它“不起作用”但您没有显示代码。要更详细地了解它为什么不起作用,请考虑向我们展示代码。

为了让它工作考虑给你的 PanelX 类getPreferredSize()覆盖,这将有助于设置 JPanel 的初始大小。

例如:

import java.awt.BorderLayout;
import java.awt.Dimension;

import javax.swing.*;

public class SimpleGuiLayout {

   private static void createAndShowGui() {
      JPanel totalPanel = new JPanel(new BorderLayout());

      totalPanel.add(new PanelX(800, 200, "Panel A"), BorderLayout.PAGE_START);
      totalPanel.add(new PanelX(800, 400, "Panel B"), BorderLayout.CENTER);
      JFrame frame = new JFrame("Simple Gui Layout");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(totalPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

class PanelX extends JPanel {
   private int prefW;
   private int prefH;

   public PanelX(int prefW, int prefH, String title) {
      this.prefW = prefW;
      this.prefH = prefH;
      setBorder(BorderFactory.createTitledBorder(title));
   }

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(prefW, prefH);
   }
}

如果运行,它看起来像这样:
在此处输入图像描述

并且会适当调整大小。

于 2012-09-20T23:30:08.207 回答
3

一种方法(可能不是最简单的)是 GridBagLayout。

使用 weightx 和 weighty 约束来控制哪些成员可以调整大小。

于 2012-09-20T23:32:30.310 回答
3

我推荐一个 GridBagLayout。使用起来很复杂,但它可以解决您的问题。假设 panelA 位于 panelB 之上,您将有以下约束:

  • panelA 和 panelB 的 gridx 将为 0
  • panelA 将是 ad gridy 0,而 panelB 在 gridy 1
  • 对于两者,您将设置 fill = BOTH
  • 但是只有 panelB 的高度增加,您可以将 panelB 的 weighty 设置为 1.0,将 panelA 的设置为 0
于 2012-09-20T23:33:23.477 回答
0

您最初使用 BorderLayout 的解决方案已经可以使用,您只需要设置 panelA 的首选高度:

    panelA.setPreferredSize(new Dimension(0, 200));

宽度无关紧要,因为 BorderLayout 将忽略添加到 NORTH 或 SOUTH 的组件的首选宽度。

于 2017-08-22T13:37:52.917 回答