Можете ли вы установить постоянный размер для JPanel внутри JFrame? - PullRequest
3 голосов
/ 25 ноября 2008

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

Изображение

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

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

Ответы [ 4 ]

3 голосов
/ 11 декабря 2008

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, если вы не хотите, чтобы все кнопки были одинакового размера. Добавьте все свои кнопки на эту внутреннюю панель вместо основной.

2 голосов
/ 25 ноября 2008

Если вы хотите, чтобы две шахматные доски оставались одинакового размера, вам нужно, чтобы каждая из них содержала свои собственные 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 встроен превосходный дизайнер UI . Скачать Netbeans здесь .

1 голос
/ 25 ноября 2008

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

0 голосов
/ 26 ноября 2008

Мне удалось решить подобные проблемы с помощью TableLayout, который является сторонним менеджером макета. Вам нужно будет загрузить его и прочитать учебник, но ключом будет установка выравнивания на CENTER при добавлении кнопок J на ​​их позиции в макете.

...