带有 SpringLayout 首选大小的 JPanel 无法计算正确的值



我看不出如何使用SpringLayout正确计算其首选大小的JPanel,因为目前它总是(0,0)。我试着打电话给panel.setPreferredSize(layout.preferredLayoutSize(panel));,但它并没有改变任何东西。我还尝试在面板的南侧和东侧放置约束(在下面的代码中注释掉)与最南/最东的组件相比,虽然它开始给我正确的首选大小,但在调整 JFrame 大小时 GUI 绝对会搞砸(例如,某些组件移出视图、相互重叠等)。

这是给我带来问题的类:

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的北边缘与油漆的北边缘对齐,同时将它们的两个西边缘与容器的西边缘对齐,可以使它们重叠。

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(),我的宽度和高度也从未为零。

最新更新