2012-05-25 3 views
0

Я добавил некоторые компоненты к JPanel, который настроен на макет сетки, и я добавляю это к JFrame, который установлен на макет границы. Но я хочу исправить размер панели. Когда мое окно максимизируется, размер всех компонентов увеличивается. Я хочу, чтобы панель в центре окна, с фиксированный размер, даже если окно максимально.Фиксированный размер панели в кадре

+0

* «Пожалуйста, помогите мне с некоторым кодированием» * Пожалуйста, помогите себе в вопросе и любых признаках усилий. SO не является машиной для генерации кода. BTW. Не используйте форматирование текста для текста и проверяйте форматы сообщений, как вы ожидаете в предварительном просмотре. Голосование закрывается. –

+0

Если вы предоставите некоторый код, это будет лучше. Например, я бы посмотрел в вашем коде, чтобы узнать, где и где вы называете 'setPreferredSize'. –

+0

Если панель содержит человекообразный текст, не делайте этого! Метрики шрифтов варьируются в зависимости от платформы. – trashgod

ответ

3

Поместите панель с GridLayout в качестве одного компонента в GridBagLayout без ограничений - он будет центрирован. Добавьте панель с GBL в CENTER из BorderLayout.

См this example для вышеуказанного изображения.


Nested Layout Example также использует GBL для центрирования изображения в нижней части свитка панели справа.

+0

+1 для приятного изображения и короткого решения. – brimborium

0
JFrame frame = new JFrame(); 
    frame.setSize(500, 500); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.getContentPane().setLayout(new BorderLayout()); 

    JPanel rootPanel = new JPanel(); 
    frame.getContentPane().add(rootPanel, BorderLayout.CENTER); 
    rootPanel.setLayout(new GridBagLayout()); 

    JPanel contentPanel = new JPanel(); 

    Dimension dimension = new Dimension(300, 300); 
    contentPanel.setMaximumSize(dimension); 
    contentPanel.setMinimumSize(dimension); 
    contentPanel.setPreferredSize(dimension); 
    contentPanel.setBackground(Color.YELLOW); 

    GridBagConstraints g = new GridBagConstraints(); 
    g.gridx = 0; 
    g.gridy = 0; 
    g.anchor = GridBagConstraints.CENTER; 
    rootPanel.add(contentPanel, g); 

    frame.setVisible(true); 
+0

1) Использование форматирования кода 2) Это редко, если вообще когда-либо, ответ. -1 –

+0

По крайней мере, это не поможет в этом случае. – brimborium

1

Ну тогда вы не должны использовать BorderLayout, потому что как раз подходит для дочерних элементов. Если вы все еще хотите использовать BoderLayout на JFrame (потому что вам нужна боковая панель или что-то подобное), Вы можете просто обернуть свой JPanel (с помощью GridLayout) в другой JPanel с помощью GridBagLayout или BoxLayout или что-то подобное, а затем поместить этот другой JPanel в JFrame.

JPanel innerPanel = new JPanel(); 
innerPanel.setLayout(new GridLayout()); 
// fill and set your innerPanel 

JPanel middlePanel = new JPanel(); 
middlePanel.setLayout(new GridBagLayout()); 
middlePanel.add(innerPanel, constraintsThatPlaceItWhereYouWantIt); 

JFrame yourFrame = new JFrame(); 
yourFrame.setLayout(new BorderLayout()); 
yourFrame.add(middlePanel, BorderLayout.CENTER); 
+0

'middlePanel.add (innerPanel, constraintsThatPlaceItWhereYouWantIt);' Смотрите мой ответ, почему 'constraintsThatPlaceItWhereYouWantIt' является избыточным для центрирования компонента в GBL. Он ссылается на пример кода. –

+0

Вы правы, но я все еще всегда даю ограничения при добавлении из-за удобочитаемости. И он мог бы сделать несколько более продвинутых вещей с ним относительно размещения. – brimborium

+0

'middlePanel.add (innerPanel/* put in center * /);';) –

Смежные вопросы