3

我一直在做一个应该模拟赌博游戏的小项目。不幸的是,我在使用BoxLayout. 据我所知,LayoutManagers 通常尊重任何组件的首选尺寸。但是,在下面的代码中,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;
    }
}

尽管为两个 s 指定了首选大小JButton,但它们不会更改其大小。我也试过了setMaximumSize()setMinimumSize()但都没有任何效果。

我是否忽略了一些明显的东西,或者这是一个限制BoxLayout

4

1 回答 1

2

“据我所知,LayoutManagers 通常会尊重任何组件的首选大小” ——这实际上是不正确的。首选/最小/最大大小只是布局管理器可以用来确定如何最好地布局内容的“提示”。如果他们愿意,允许布局管理器简单地忽略它们。

来自 JavaDocs

BoxLayout尝试以首选的宽度(对于水平布局)或高度(对于垂直布局)排列组件。对于水平布局,如果不是所有组件的高度相同,BoxLayout 会尝试使所有组件与最高组件一样高。如果特定组件无法做到这一点,则 BoxLayout 会根据组件的 Y 对齐方式垂直对齐该组件。默认情况下,组件的 Y 对齐为 0.5,这意味着组件的垂直中心应与其他具有 0.5 Y 对齐的组件的垂直中心具有相同的 Y 坐标。

同样,对于垂直布局,BoxLayout 尝试使列中的所有组件与最宽的组件一样宽。如果失败,它会根据它们的 X 对齐方式水平对齐它们。对于 PAGE_AXIS 布局,水平对齐是基于组件的前缘完成的。换句话说,如果容器的 ComponentOrientation 从左到右,则 X 对齐值 0.0 表示组件的左边缘,否则表示组件的右边缘。

于 2013-01-09T01:05:37.133 回答