简单的GUI Java布局问题

时间:2012-09-20 23:27:51

标签: java swing jframe jpanel layout-manager

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

我希望JFrame只有一个小组totalPaneltotalPanel应包含两个面板,这些面板是我编写的自定义类PanelA和PanelB。 PanelA从高度200开始,PanelB从高度400开始。当用户展开窗口或调整窗口大小时,只有PanelB的高度会增加,但两个面板都会增加宽度。

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

3 个答案:

答案 0 :(得分:4)

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

有关布局管理器的更多信息,请查看教程:Lesson: Laying Out Components Within a Container

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

要使其工作,请考虑提供有助于设置JPanel的初始大小的PanelX类getPreferredSize()覆盖。

例如:

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

如果运行,它会是这样的:
enter image description here

并会适当调整大小。

答案 1 :(得分:3)

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

  • panelA和panelB的gridx将为0
  • panelA将是ad gridy 0,panelB将是gridy 1
  • 对于两者,你会设置fill = BOTH
  • 但是只有panelB的高度增加,你可以将panelB的权重设置为1.0,将panelA设置为0

答案 2 :(得分:0)

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

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

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