Java BoxLayout拒绝接受JButton的首选尺寸

Java BoxLayout拒绝接受JButton的首选尺寸,java,swing,jpanel,jbutton,layout-manager,Java,Swing,Jpanel,Jbutton,Layout Manager,我一直在做一个模拟赌博游戏的小项目。不幸的是,我在使用BoxLayout时遇到了一些奇怪的问题。据我所知,LayoutManagers通常采用任何组件的首选尺寸。但是,在下面的代码中,BoxLayout没有 以下是我迄今为止的代码: import java.awt.*; import javax.swing.*; public class Main { public static void main(String[] args) { JFrame.setDef

我一直在做一个模拟赌博游戏的小项目。不幸的是,我在使用
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的一个限制?

“据我所知,布局经理通常会尊重任何组件的首选尺寸”——事实并非如此。首选/min/max大小只是“提示”,布局管理器可以使用这些提示来确定如何最好地布局这些内容。如果布局管理员愿意,他们可以直接忽略它们

来自JavaDocs

BoxLayout尝试以首选宽度排列组件 (对于水平布局)或高度(对于垂直布局)。暂时 水平布局,如果不是所有组件都具有相同的高度, BoxLayout试图使所有组件都达到最高的高度 组成部分。如果某个特定组件不可能这样做,那么 BoxLayout将根据 组件的Y对齐。默认情况下,零部件的Y对齐方式为 0.5,这意味着该组件的垂直中心应具有与其他组件的垂直中心相同的Y坐标 0.5 Y对齐

同样,对于垂直布局,BoxLayout尝试使所有 列中的组件与最宽组件的宽度相同。如果 如果失败,它将根据它们的X对齐方式将它们水平对齐。 对于页面_轴布局,水平对齐是基于 组件的前缘。换句话说,X对齐值为 如果容器的ComponentOrientation是从左到右的,则0.0表示组件的左边缘,它表示组件的右边缘 否则,组件将被删除


不过,我使用的首选尺寸应该没有任何问题。在
JPanel
中有足够的空间来容纳
JButton
s,他们只是拒绝通过任何方式修改其大小,只是在标签上添加更多文本。我已经阅读了文档,但没有看到任何解释我现在遇到的问题的内容。@Thrfoot我运行了您的测试代码,
BoxLayout
只是拒绝使用
JButton
preferredSize
,不管我做了什么尝试。通常情况下,以这种方式操纵组件的首选大小是不可取的,通常鼓励我们使用布局管理器或直接重写
getPreferredSize
方法。奇怪的是,
FlowLayout
工作得很好……真奇怪。。。嗯,我想我无法让它与
BoxLayout
一起工作。你会推荐其他我可以获得或多或少类似效果的布局管理器吗?@Thrfoot当你将宽度和高度设置为相等时,尝试使用左侧对齐的
FlowLayout
,成功了!谢谢我想有时候事情就是不管用。您可以始终使用
BoxLayout
,但是嵌套组件…对不起,我不确定嵌套是什么意思。我对布局管理器比较陌生。如果将按钮放置在面板上,并将面板直接添加到容器中,而不是按钮,则面板的大小将被调整,而不是按钮。