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

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

Изображение

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

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

Пожалуйста, обновите изображение!

Everlight 19.05.2016 00:31
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
1
39 185
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

Ответ принят как подходящий

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

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

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

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