2016-12-28 38 views
0

У меня есть JFrame, который устанавливает область содержимого в JPanel, у которого есть BoxLayout и еще два JPanels, один из них - «верхняя панель», а другой - это контент, с которым я хочу работать. Верхняя панель должна занимать именно тот размер, который я им даю, и панель содержимого должна занимать все остальное, но вместо этого они занимают половину пространства. Что я делаю не так?Изменить размер JPanel в пределах BoxLayout

Мои классы:

public class TopBar extends JPanel 
{ 
    public TopBar() 
    { 
     setLayout(new FlowLayout()); 
     setPreferredSize(new Dimension((int) (MyFrame.WIDTH/MyFrame.COMPRESSION), MyFrame.TOPBAR)); 
     add(new JButton("something")); 
    } 
} 


public class ContentPanel extends JPanel 
{ 
    public ContentPanel() 
    { 
     setLayout(null); 
    } 
} 

public class MyJpanel extends JPanel 
{ 
    private JPanel topPanel; 
    private JPanel contentPanel; 

    public MyJpanel() 
    { 
     this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); 

     topPanel = new TopBar(); 
     contentPanel = new ContentPanel(); 

     add(topPanel); 
     add(contentPanel); 
    } 
} 
+0

Для вашего верхнего бара я думаю, что 'JToolBar' использует' BoxLayout' внутри. –

+0

1) Чтобы лучше помочь, опубликуйте [MCVE] или [Short, Self Contained, Correct Example] (http://www.sscce.org/). 2) Обеспечить ASCII-искусство или простой рисунок * предназначенного макета GUI при минимальном размере и, если он изменен, с большей шириной и высотой. –

ответ

-1

Вы должны использовать SetSize вместо setPreferredSize.

+0

Это дает тот же результат. –

+0

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

-1

Моя ошибка заключалась в том, что я не установил предпочтительный размер обеих панелей, если бы я установил размер contentPane, и он будет работать.

+0

См. [Следует избегать использования методов метода Set (Preferred | Maximum | Minimum) в Java Swing?] (Http://stackoverflow.com/q/7229226/418556) (Да.) –

+0

Обратите внимание, что это редко необходимо чтобы явно обрабатывать предпочтительный размер компонента путем установки или переопределения предпочтительного размера. Если вы опубликуете искусство MCVE/SSCCE и ASCII, как было предложено в моих комментариях к этому вопросу, станет более понятным, если этот GUI действительно нуждается в редком решении или, более вероятно, использовании макетов, предлагаемых размеров компонентов и пробелов (в форма заполнения макета или пустые границы) для обеспечения минимального размера. –

+0

(1-) каждый компонент Swing будет определять свой собственный предпочтительный размер. Затем задание менеджера макета использовать эту информацию для определения размера и местоположения каждого компонента. – camickr

0

, но вместо этого они оба принимают половину пространства

BoxLayout выделит дополнительное пространство для каждого компонента до компонентов максимального размера.

Верхний бар должен занимать именно размер я придав ему и панель контента должна занимать остальное,

Тогда не используйте BoxLayout. Диспетчер компоновки по умолчанию для области содержимого JFrame - это BorderLayout, который выполняет именно то, что вы хотите.

Для получения дополнительной информации и рабочих примеров ознакомьтесь с разделом из учебника Swing по телефону How to Use BorderLayout.