JPanel's с SpringLayout предпочитаемым размером не вычисляет правильное значение

Я не вижу, как сделать JPanel с SpringLayout правильно рассчитать его предпочтительный размер, как в настоящее время это всегда (0, 0). Я пробовал звонить panel.setPreferredSize(layout.preferredLayoutSize(panel));Однако это ничего не меняет. Я также попытался наложить ограничения (закомментировано в коде ниже) на южную и восточную стороны панели по сравнению с компонентами, которые являются наиболее южными / восточными, и, хотя он начинает давать мне правильный предпочтительный размер, графический интерфейс совершенно не работает при изменении размера JFrame (например, некоторые компоненты смещаются из поля зрения, накладываются друг на друга и т. д.).

Это класс, который дает мне проблемы:

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)); 

    }

}

1 ответ

Решение

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().

Другие вопросы по тегам