gpt4 book ai didi

java - JPanel 的 SpringLayout PreferredSize 未计算出正确的值

转载 作者:行者123 更新时间:2023-12-01 21:25:38 25 4
gpt4 key购买 nike

我不知道如何使带有 SpringLayout 的 JPanel 正确计算其首选大小,因为目前它始终是 (0, 0)。我尝试调用 panel.setPreferredSize(layout.preferredLayoutSize(panel));,但它没有改变任何内容。我还尝试在面板的南侧和东侧相对于最南/东的组件放置约束(在下面的代码中注释掉),虽然它开始给我正确的首选大小,但在调整 JFrame 大小时 GUI 绝对会变得困惑(例如,某些组件移出 View 、相互重叠等)。

这是给我带来问题的类(class):

public class TileView extends JPanel {

private TilesController controller;

private JRadioButton paint, select;
private JPanel prototype_panel, selection_panel;

public TileView (TilesController tiles_controller) {
controller = tiles_controller;
SpringLayout layout = new SpringLayout();
setLayout(layout);

prototype_panel = new TileBrushPanel(controller);
selection_panel = new TileSelectionPanel(controller);
paint = new JRadioButton("draw");
paint.addActionListener(l -> controller.setPaintTileMode());
select = new JRadioButton ("select");
select.addActionListener(l -> controller.setSelectMode());

ButtonGroup bGroup = new ButtonGroup();
bGroup.add(paint);
bGroup.add(select);

layout.putConstraint(NORTH, paint, 4, NORTH, this);
layout.putConstraint(WEST, paint, 4, WEST, this);
add (paint);

layout.putConstraint(NORTH, select, 0, NORTH, paint);
layout.putConstraint(WEST, select, 4, EAST, paint);
add (select);

layout.putConstraint(NORTH, prototype_panel, 4, NORTH, paint);
layout.putConstraint(WEST, prototype_panel, 4, WEST, this);
add (prototype_panel);

layout.putConstraint(NORTH, selection_panel, 0, NORTH, prototype_panel);
layout.putConstraint(WEST, selection_panel, 4, EAST, prototype_panel);
add (selection_panel);

//layout.putConstraint(SOUTH, this, 4, SOUTH, prototype_panel);
//layout.putConstraint(EAST, this, 0, EAST, selection_panel);
setPreferredSize(layout.preferredLayoutSize(this));

}

}

最佳答案

SpringLayout 工作得很好。你第一次就做对了;您应该取消注释最后两个 putConstraint 调用,并删除 setPreferredSize 调用。

您没有得到预期结果的原因可能是由于这一行:

layout.putConstraint(NORTH, prototype_panel, 4, NORTH, paint);

你可能想写成:

layout.putConstraint(NORTH, prototype_panel, 4, SOUTH, paint);

通过将prototype_panel的北边缘与paint的北边缘对齐,同时将它们的西边缘与容器的西边缘对齐,您可以使它们重叠。

SpringLayout 很难使用。在我看来,您最好使用不同的布局或布局的组合。将许多面板嵌套在一起并没有什么问题。

就您而言,我相信您可以使用 Box 实例完成相同的布局:

Box radioButtons = Box.createHorizontalBox();
radioButtons.add(paint);
radioButtons.add(select);

Box panels = Box.createHorizontalBox();
panels.add(prototype_panel);
panels.add(selection_panel);

Box windowContents = Box.createVerticalBox();
windowContents.add(radioButtons);
windowContents.add(panels);

setLayout(new BorderLayout());
add(windowContents);

它并没有短多少,但更容易阅读和理解。

至于为什么你的宽度和高度为零,我只能猜测你在验证之前打印出了首选尺寸。即使使用您的 SpringLayout 代码,当我将 TileView 面板添加到 JFrame 并在其上调用 pack() 时,我的宽度和高度也从未为零。

关于java - JPanel 的 SpringLayout PreferredSize 未计算出正确的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38192245/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com