Можете ли вы установить постоянный размер для JPanel внутри JFrame?

StackOverflow https://stackoverflow.com/questions/316454

Вопрос

Моя текущая проблема заключается в том, что у меня есть JFrame с описанием сетки 2x2.И внутри одного из квадратов у меня есть JPanel, который предназначен для отображения сетки.У меня рабочий день с библиотекой Java swing...взгляните

Изображение

Java автоматически расширяет каждую JLabel так, чтобы она соответствовала размеру экрана.Я хочу, чтобы это были просто синие квадраты (вода) и черная граница, а не это серое пространство.Есть ли способ, которым я могу просто установить размер этой JPanel постоянно, чтобы мне не приходилось миллион раз изменять размер JFrame, прежде чем я получу точный размер, чтобы серое пространство исчезло?

Я также хотел бы установить размер этих кнопок, чтобы они не были такими огромными (BorderLayout используется для кнопок и текстового поля)

Это было полезно?

Решение

Если вы хотите, чтобы две шахматные доски оставались одинакового размера, вам нужно, чтобы каждая из них содержалась в своей собственной JPanel . Установите для каждого из родительских JPanel тип макета GridBagLayout . Установите значение preredSize для каждого компонента шахматной доски, а затем добавьте их в соответствующие контейнеры. GridBagLayout по умолчанию должен размещать каждую доску в центре родительской JPanel. Таким образом, по мере изменения размера окна родительская область JPanel будет увеличиваться или уменьшаться, а компоненты шахматной доски внутри будут оставаться одинакового размера.

В качестве альтернативы, вы можете сделать так, чтобы ваши синие квадраты масштабировались до нужного размера, поскольку размер окна изменялся, если бы каждый квадрат шахматной доски был JPanel с менеджером макета BorderLayout и добавлением JLabel (с синим цветом фона) и его BorderLayout.CENTER .

Что касается ваших кнопок, попробуйте что-то вроде этого:

JPanel theButtonPanel = new JPanel(new BorderLayout());
JButton button1 = new JButton("Fire");
JButton button2 = new JButton("Pass");
JButton button3 = new JButton("Forfiet");

JPanel innerButtonContainer = new JPanel(new Grid(1, 3, 8, 8));
innerButtonContainer.add(button1);
innerButtonContainer.add(button2);
innerButtonContainer.add(button3);

theButtonPanel.add(innterButtonContainer);

Наконец, рассмотрите возможность использования инструмента дизайна для пользовательского интерфейса Swing. В Netbeans встроен превосходный пользовательский интерфейс . Загрузите Netbeans здесь .

Другие советы

GridBagLayout - это то, что вы действительно хотите использовать. GridLayout будет принудительно устанавливать одинаковый размер для каждого компонента в макете, независимо от того, какие ограничения размера вы на них накладываете. GridBagLayout намного мощнее и намного сложнее. Ознакомьтесь с страницей API для этого. Используя GridBagLayout , компоненты не будут заполнять все пространство сетки, если вы этого не хотите, и даже могут сохранять размер, который вы запрашиваете. Чтобы размер компонента не менялся, я бы установил все три доступных ограничения размера:

water.setPreferredSize(new Dimension(20, 20));
water.setMinimumSize(new Dimension(20, 20));
water.setMaximumSize(new Dimension(20, 20));

Для ваших кнопок я бы определенно использовал внутреннюю панель как Брайан упоминает. Вы можете использовать GridLayout, как он предлагает, или FlowLayout, если вы не хотите, чтобы все кнопки были одинакового размера. Добавьте все свои кнопки на эту внутреннюю панель вместо основной.

Если вы можете setResizeable (false) в фрейме верхнего уровня, вы можете настроить менеджер макета на нулевой и жесткий код для каждого местоположения и размера с помощью setBounds. Вот как я это сделаю (конечно, в зависимости от изменения размера).

Я добился успеха в решении подобных проблем, используя TableLayout который является сторонним менеджером верстки.Вам нужно будет загрузить его и прочитать руководство, но ключевым моментом будет установка выравнивания по ЦЕНТРУ при добавлении JButtons на их позиции в макете.

scroll top