2013-06-13 4 views
2

Так что это довольно простая проблема, но я не могу найти простой способ ее реализовать. У меня в основном есть три примера JPanel: север, юг и центр. Обычно, если вы играете с высотой окна, центральная панель будет переменной. Я бы хотел, чтобы высота южной панели была переменной, а не центральной.Сделать нижнюю панель в Borderlayout расширять, как центральную панель

Вот код:

public class TestCode { 

public static void main(String[] args) { 

    JFrame window = new JFrame("Test"); 
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    window.setSize(300, 300); 

    JPanel panelUp = new JPanel(); 
    JPanel panelCenter = new JPanel(); 
    JPanel panelDown = new JPanel(); 

    window.add(panelUp, BorderLayout.NORTH); 
    window.add(panelCenter, BorderLayout.CENTER); 
    window.add(panelDown, BorderLayout.SOUTH); 

    panelUp.setBackground(new Color(200, 240, 200)); 
    panelCenter.setBackground(new Color(240, 200, 200)); 
    panelDown.setBackground(new Color(200, 200, 240)); 

    panelUp.setPreferredSize(new Dimension(panelUp.getWidth(), 50)); 
    panelCenter.setPreferredSize(new Dimension(panelCenter.getWidth(), 100)); 
    panelDown.setPreferredSize(new Dimension(panelDown.getWidth(), window.getHeight() - 150)); 

    window.setVisible(true); 
} 

} 
+0

Изменить макеты , Может быть, что-то вроде «GridBagLayout» будет работать лучше – MadProgrammer

+0

Вы также можете использовать «BoxLayout» –

+0

Thanx, я посмотрю на эти компоненты ... –

ответ

1

Просто добавьте вершину и центр в панель, которая сама по себе граница раскладка:

public static void main(String[] args) { 

    JFrame window = new JFrame("Test"); 
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    window.setSize(300, 300); 


    JPanel innerPanel = new JPanel(new BorderLayout()); 


    JPanel panelUp = new JPanel(); 
    JPanel panelCenter = new JPanel(); 
    JPanel panelDown = new JPanel(); 

    window.add(innerPanel, BorderLayout.NORTH); 
    window.add(panelDown, BorderLayout.CENTER); 

    innerPanel.add(panelUp, BorderLayout.NORTH); 
    innerPanel.add(panelCenter, BorderLayout.SOUTH); 

    panelUp.setBackground(new Color(200, 240, 200)); 
    panelCenter.setBackground(new Color(240, 200, 200)); 
    panelDown.setBackground(new Color(200, 200, 240)); 

    panelUp.setPreferredSize(new Dimension(panelUp.getWidth(), 50)); 
    panelCenter.setPreferredSize(new Dimension(panelCenter.getWidth(), 100)); 
    panelDown.setPreferredSize(new Dimension(panelDown.getWidth(), window.getHeight() - 150)); 

    window.setVisible(true); 
} 

Этот код должен делать то, что вы хотите, в то время как едва изменяя код

+1

* «.. FLOWLAYOUT. Это должно сделать трюк» * a) У нас нет необходимости в SHOUT , b) Он выполнит только «требование», если программист вручную устанавливает ширину кадра (чтобы заставить один компонент перейти к следующей строке). Это очень хрупкое программирование. –

+0

, затем ... на панели NORTH добавьте еще одну панель Borderlayout. Затем эта внутренняя панель borderlayout должна иметь две панели, установленные в СЕВЕРЕ, а затем в ЮГ. Я должен сделать трюк –

+0

Я обновил ответ. Нет необходимости использовать flowlayout –

0

Вы пробовали настройки максимального размера (setMaximumSize) для северной и центральной панели? Или, возможно, setSize напрямую.

+0

Извините, но никакого эффекта с setMaximumSize(), или setSize() –

+0

О, хорошо то вам действительно нужно будет использовать правильный менеджер макетов. Вы можете сделать почти что угодно с GridBagLayout. Вначале это может показаться немного сложным или запутанным, но, как только у вас будут основы, вы можете легко построить все, что захотите. – Machisuji

2

Я хочу, чтобы высота южной панели была переменной вместо центральной.

  • не представляется возможным с BorderLayout, не слушая JFrame из ComponentListener, перерасчета для PreferredSize, а затем вызвать JFrame.revalidate() и JFrame.repaint(),

  • использование собственно LayoutManager

    1. GridBagLayout

    2. SpingLayout по @aterai

    3. пользовательских MigLayout, TableLayout

+0

Я посмотрю на эти макеты, я думаю, что единственный оригинальный (включенный в Swing) - GridBagLayout, остальные - дополнительные компоненты, правда? –

+0

все равно, есть ли JPanel или JComponent, LayoutManager работает очень похоже на то, как для контейнера, так и для компонентов, обратите внимание, что JFrame (JDialof/JWindow) не имеет BorderLayout, а JPanel имеет FlowLayout, реализованный в API в качестве LayoutManagers по умолчанию, из JComponents нет ни одного LayoutManager (забыл для JToolbar - BoxLayout) – mKorbel

+0

Почему вы не используете BorderLayout CENTER и TOP, а затем в TOP, поместите две панели flowlayout? Не нужно использовать GBL или SL –

3
***************BorderLayout************************ 
* ********BorderLayout*in*PAGE_START************ * 
* *           * * 
* * Component in PAGE_START     * * 
* *           * * 
* * Component in PAGE_END     * * 
* *           * * 
* ********************************************** * 
*             * 
*  Component in CENTER      * 
*             * 
*************************************************** 

Смотрите Nested Layout Example для большего количества идей о том, как объединить макеты для создания необходимого макета.

+0

Извините, но я точно не вижу point, thanx за вашу помощь, но, на мой взгляд, это слишком общий случай, поскольку то, что я просил, было точной вещью. –

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