我一直在从事一个应该模拟赌博游戏的小项目。不幸的是,在使用BoxLayout
时遇到了一些奇怪的问题。据我所知,LayoutManager
通常会尊重任何组件的首选大小。但是,在下面的代码中,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
指定了首选大小,但它们均未更改大小。我也尝试过setMaximumSize()
和setMinimumSize()
,但是都没有任何效果。我是否忽略了某些明显的内容,或者这是
BoxLayout
的限制? 最佳答案
“据我所知,LayoutManager通常会尊重任何组件的首选大小”-实际上并非如此。首选/最小/最大大小只是布局管理员可以用来确定如何最好地布局其中内容的“提示”。允许布局管理器仅在需要时忽略它们。
从JavaDocs
BoxLayout尝试以其首选宽度排列组件
(用于水平布局)或高度(用于垂直布局)。为一个
水平布局,如果不是所有组件的高度都相同,
BoxLayout尝试使所有组件都达到最高
零件。如果特定组件无法做到这一点,那么
BoxLayout根据
组件的Y对齐。默认情况下,组件的Y对齐为
0.5,这意味着零部件的垂直中心应与其他零部件的垂直中心具有相同的Y坐标,且
0.5 Y对齐。
同样,对于垂直布局,BoxLayout尝试使所有
列中的组件与最宽的组件一样宽。如果说
失败,它将根据其X对齐水平对齐它们。
对于PAGE_AXIS布局,水平对齐是基于
组件的前沿。换句话说,X对齐值是
如果容器的ComponentOrientation从左到右,则0.0表示组件的左边缘,它表示
否则为组件。
关于java - BoxLayout拒绝遵守JButton的首选大小,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14226622/