BoxLayout的拒绝兑付的JButton的首选大小(BoxLayout refuses to h

2019-08-06 02:31发布

我一直在努力是应该模拟赌博游戏的一个小项目。 不幸的是,我遇到了一些奇怪的问题,与工作时BoxLayout 。 据我所知, LayoutManager S键通常会尊敬所有组件的首选大小。 然而,在下面的代码, BoxLayout没有。

这里是我的代码至今:

import java.awt.*;
import javax.swing.*;



public class Main 
{
    public static void main(String[] args)
    {
      JFrame.setDefaultLookAndFeelDecorated(true);
      JFrame frame = new JFrame("Suit-Up");
      frame.setContentPane(makeGUI());
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setSize(900,450);
      frame.setLocationRelativeTo(null);
      frame.setResizable(false);
      frame.setVisible(true);
    }

    public static JPanel makeGUI()
    {
      JPanel main = new JPanel();
      main.setMinimumSize(new Dimension(900,450));
      main.setBackground(Color.red);

      JPanel infoPanel = new JPanel();
      infoPanel.setLayout(new BoxLayout(infoPanel, BoxLayout.LINE_AXIS));
      infoPanel.setPreferredSize(new Dimension(900,60));
      infoPanel.setBackground(Color.green);
      main.add(infoPanel);

      JPanel infoText = new JPanel();
      infoText.setLayout(new BoxLayout(infoText, BoxLayout.PAGE_AXIS));
      infoPanel.add(infoText);

      JPanel moneyText = new JPanel();
      moneyText.setLayout(new BoxLayout(moneyText, BoxLayout.LINE_AXIS));
      infoText.add(moneyText);

      JPanel lastGameText = new JPanel();
      lastGameText.setLayout(new BoxLayout(lastGameText, BoxLayout.LINE_AXIS));
      infoText.add(lastGameText);

      JButton playAgain = new JButton("Play Again ($20)");
      playAgain.setPreferredSize(new Dimension(200,60));
      infoPanel.add(playAgain);

      JButton finish = new JButton("End Session");
      finish.setPreferredSize(new Dimension(200,60));
      infoPanel.add(finish);

      JPanel cardPanel = new JPanel();
      cardPanel.setLayout(new BoxLayout(cardPanel, BoxLayout.LINE_AXIS));
      main.add(cardPanel);

      return main;
    }
}

尽管指定首选大小两个JButton S,它们不改变它们的大小。 我曾尝试setMaximumSize()setMinimumSize()为好,但没有任何效果。

我俯瞰明显的东西,或者这是一个限制BoxLayout

Answer 1:

“据我所知,布局管理通常尊敬所有组件的首选大小” -这实际上是不正确的。 首选/最小/最大尺寸只是“暗示”该布局管理器可以使用,以确定如何最好地布局有内容。 布局管理器允许简单地忽略他们,如果他们想。

从JavaDoc中

的BoxLayout 试图安排在它们的优选的宽度(对于水平布局)或高度(对于垂直布局)分量。 对于水平布局,如果并不是所有的组件都具有相同的高度,的BoxLayout试图让所有的组件一样高的最大组成部分。 如果对于特定的元件是不可能的,则BoxLayout的对准该组件垂直,根据组件的Y调整。 默认情况下,一个部件具有0.5的Y调整,这意味着该组件的垂直中心应具有相同的Y坐标的其它部件的垂直的中心与0.5 Y调整。

类似地,对于垂直布局,BoxLayout的试图使所有组分在列一样宽的最宽部分。 如果失败,它根据自己的X对准它们对齐水平。 对于PAGE_AXIS布局,水平取向是基于所述组件的前缘进行。 换言之,0.0的X对准值指的是部件的左边缘,如果容器的ComponentOrientation为从左到右,这意味着该组件的右边缘除外。



文章来源: BoxLayout refuses to honor preferred size of JButton