2013-05-31 5 views
0

По какой-то причине мои JPanels, которые я добавляю к содержимому JPanel, растягиваются вертикально, а не являются предпочтительным размером. Вот код:Как сохранить контент в растяжении в JPanel при использовании BorderLayout?

public static JPanel content; 

    public APP() 
    { 
     setLayout(new BorderLayout()); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     setJMenuBar(new MenuBar()); 

     content = new JPanel(new GridLayout(0, 8, 2, 2)); 
     add(new JScrollPane(content, 22, 32), BorderLayout.CENTER); 

     pack(); 
     setLocationRelativeTo(null); 
     setResizable(false); 
     setVisible(true); 

     addJPanel(); 
     addJPanel(); 
    } 

    public void addJPanel() 
    { 
     JPanel box = new JPanel(); 
     box.setPreferredSize(new Dimension(100, 100)); 
     box.setBackground(Color.BLACK); 
     content.add(box); 
     content.validate(); 
    } 

Как я могу сохранить их в определенном размере при их добавлении? Или, по крайней мере, не позволяйте им растягиваться полностью через панель содержимого. Я хочу, чтобы они были одинакового размера, без изменения их размеров, поскольку добавлено больше панелей.

* ПРИМЕЧАНИЕ: addJPanel() позволяет динамически добавлять новые панели в панель содержимого с помощью кнопки или действия. Это всего лишь тестовый метод, реальное добавление панелей происходит из действия, вызываемого кнопкой меню.

+3

Не используйте BorderLayout, если вы не хотите, чтобы он растягивался. Может быть, переключитесь на 'GirdBagLayout', который центрирует ваш компонент и сохранит их предпочтительное значение. –

+0

@GuillaumePolet Ну, BorderLayout используется в JFrame, JPanel - это тот, который использует GridLayout, и вещи добавляются к нему, поэтому BorderLayout не должен влиять на Это. И это не так. Если я удалю строки BorderLayout, ничего не изменится. –

+0

@Guillaume Polet не ошибается, этот контейнер отлично уложен, JFrame с (в области CENTER) JScrollPane с/вложенным JPanel, лучшим из вариантов .... – mKorbel

ответ

1

я в конечном итоге выяснить, решение с помощью клея для макета коробки, так как я действительно хотел использовать GridLayout, чтобы сделать вещи простыми для того, что я делаю:

Я добавил еще JPannel, а затем добавляют клей к нему, то добавляют к нему содержимое, а затем добавили панель с клеем к раме в ScrollPane:

public static JPanel content; 
public static JPanel wrapper; 

public APP() 
{ 
    setLayout(new BorderLayout()); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    setJMenuBar(new MenuBar()); 

    content = new JPanel(new GridLayout(0, 8, 2, 2)); 

    wrapper = new JPanel(new BorderLayout()); 
    wrapper.add(Box.createGlue(), BorderLayout.CENTER); 
    wrapper.add(content, BorderLayout.NORTH); 
    add(new JScrollPane(wrapper, 22, 32), BorderLayout.CENTER); 

    pack(); 
    setLocationRelativeTo(null); 
    setResizable(false); 
    setVisible(true); 
} 

Тогда я просто использовать wrapper.revalidate(), так что приходится на новые размеры. Сейчас работает как шарм.