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
,但是嵌套组件…对不起,我不确定嵌套是什么意思。我对布局管理器比较陌生。如果将按钮放置在面板上,并将面板直接添加到容器中,而不是按钮,则面板的大小将被调整,而不是按钮。