Java JPanel';具有SpringLayout preferredSize的s计算的值不正确
我看不到如何让一个带有SpringLayout的JPanel正确地计算它的首选大小,因为它总是(0,0)。我尝试调用Java JPanel';具有SpringLayout preferredSize的s计算的值不正确,java,swing,layout-manager,springlayout,Java,Swing,Layout Manager,Springlayout,我看不到如何让一个带有SpringLayout的JPanel正确地计算它的首选大小,因为它总是(0,0)。我尝试调用panel.setPreferredSize(layout.preferredLayoutSize(panel)),但它不会改变任何东西。我还尝试将约束(在下面的代码中注释掉)放在面板的南面和东面,相对于最南面/东面的组件,虽然它开始为我提供正确的首选大小,但当调整JFrame的大小时,GUI会变得完全混乱(例如,一些组件移到视图之外,相互重叠等) 这门课给了我很多问题: publ
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_面板的北边缘与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(),我也从未得到过零的宽度和高度。SpringLayout工作正常。你第一次做对了;您应该取消对最后两个putConstraint调用的注释,并删除setPreferredSize调用
您没有得到预期结果的原因可能是由于以下原因:
layout.putConstraint(NORTH, prototype_panel, 4, NORTH, paint);
您可能打算将其写为:
layout.putConstraint(NORTH, prototype_panel, 4, SOUTH, paint);
通过将prototype_面板的北边缘与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(),我也从未得到过零的宽度和高度。如果validate()
组件或pack()
封闭窗口会发生什么?1)为了更快地获得更好的帮助,请发布或。2) 请参阅(是)。如果validate()
组件或pack()
封闭窗口,会发生什么情况?1)要更快获得更好的帮助,请发布或。2) 见(是的。)