【问题标题】:Allocating space on a Frame for a Jpanel在框架上为 Jpanel 分配空间
【发布时间】:2011-06-12 22:36:41
【问题描述】:

我有一个 JFrame,我需要在其中添加 2 个不同大小的 JPanel。我正在使用 BorderLayout。我设置了 Frame,以便有足够的空间让两个面板(尺寸已经设置)完美契合。但是,当它运行时,右侧的第二个 Panel 被压扁到一边,所以它真的很薄。

public class YourCraft extends JFrame {

public Game() {

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(606, 500);

    setTitle("YourCraft");
    setResizable(false);
    setVisible(true);
    setBackground(Color.BLACK);
}

public static void main(String[] args) {
    Game main = new Game();

    Board mainBoard = new Board();
    Stats mainStats = new Stats();
    main.getContentPane().add(BorderLayout.CENTER,mainBoard);
    main.getContentPane().add(BorderLayout.EAST,mainStats);
}

【问题讨论】:

  • 您是否尝试过 .WEST 而不是 .CENTER?

标签: java swing jpanel layout-manager


【解决方案1】:

为您的组件指定一个首选尺寸。使用 setPreferredSize 为它们指定尺寸。

然后,在您的 JFrame 上调用 setVisible(true) 之前,使用方法 pack()。它将打包 JFrame 并提供足够的空间以确保尊重每个组件的首选大小(如果可能)。

问候, 斯蒂芬

【讨论】:

  • 为什么最好覆盖getter而不是在构造函数中使用setter?
  • 原因有很多,其中一个技术原因是 setXXSize 会缩短内部根据当前状态找到合理大小的所有努力。更普遍的是,返回合理的大小提示是组件的固有职责:一般规则是从不从外部干扰此类职责
  • 我相信你是对的,重用性最好覆盖getPreferredSize。尽管如此,我经常设置PreferredSize 并且永远不会得到任何副作用或弄乱任何框架。因此,当您不寻找真正可跨多个应用重用的东西时,这是一种可行的解决方法。
  • 看起来您不必清理由 setXXSize 引起的布局混乱;)
【解决方案2】:

如果您要覆盖 JPanel,则同意使用 setPreferredSize 或 getPreferredSize 为 JPanel 提供首选大小,但同样重要的是,不要设置 JFrame 的大小,而是让其组件设置其最佳大小。正如 Snicolas 所提到的,pack() 方法会为您解决这个问题。

【讨论】:

  • -1 表示 setXXSize,+1 表示 getXXSize 的自定义实现
猜你喜欢
  • 2013-12-31
  • 2014-11-28
  • 2013-03-31
  • 1970-01-01
  • 2014-11-20
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多