2015-10-26 3 views
0

Я просто пытаюсь использовать GridBagLayout после this.Swing: GridBagLayout добавление компонентов не является ожидаемым способом

Я не могу получить то, что хочу.

Я хотел бы каждую Группу занять много места, как это возможно, но это не так, я действительно пытался все, следуя инструкции в Oracle Docs

Но результат всегда один и тот же:

GBC

Я действительно не понимаю, почему макет не работает.

Я попытался изменить компоновку JFrame, установив панель как ContentPane(), попытался добавить ограничения, найденные на обоих сайтах, ничего не работает.

Ваша помощь будет оценена по достоинству.


Полный код

public class Monitor extends JFrame{ 

    // Menu 
    private JMenuBar bar = new JMenuBar(); 
    private JMenu file = new JMenu("File"); 
    private JMenuItem open = new JMenuItem("Open"); 
    private JMenuItem exit = new JMenuItem("Exit"); 

    private JPanel mainPanel = new JPanel(); 

    private JPanel secondaryPanel; 
    private JPanel explorerPanel, tagPanel; 

    public Monitor(){ 
     setTitle(""); 
     setSize(750,600); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setLocationRelativeTo(null); 
     setResizable(false); 


     initComps(); 
    } 

    public void initComps(){ 

     explorerPanel = new JPanel(); 
     explorerPanel.setBackground(Color.BLACK); 
     explorerPanel.setPreferredSize(new Dimension(250,300)); 

     tagPanel = new JPanel(); 
     tagPanel.setBackground(Color.yellow); 
     tagPanel.setPreferredSize(new Dimension(250, 300)); 

     secondaryPanel = new JPanel(); 
     secondaryPanel.setBackground(Color.blue); 
     secondaryPanel.setPreferredSize(new Dimension(500, 600)); 

     mainPanel = new JPanel(); 
     mainPanel.setPreferredSize(new Dimension(750, 600)); 
     mainPanel.setLayout(new GridBagLayout()); 

     GridBagConstraints gbc = new GridBagConstraints(); 

     gbc.gridx = 0 ; gbc.gridy = 0 ; gbc.gridwidth = 1 ; gbc.gridheight = 1; 
     mainPanel.add(explorerPanel, gbc); 

     gbc.gridx = 1 ; gbc.gridy = 0 ; gbc.gridwidth = 2 ; gbc.gridheight = 2; 
     mainPanel.add(secondaryPanel, gbc); 

     gbc.gridx = 0 ; gbc.gridy = 1 ; gbc.gridwidth = 1 ; gbc.gridheight = 1; 
     mainPanel.add(tagPanel, gbc); 

     this.setContentPane(mainPanel); 

     // Menu Bar 
     file.add(open); 

     exit.addActionListener(new ActionListener(){ 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       System.exit(0); 
      } 
     }); 
     exit.setMnemonic('q'); 
     file.add(exit); 

     bar.add(file); 
     setJMenuBar(bar); 
    } 

    public static void main(String[] args) { 
     new Monitor().setVisible(true); 

    } 
} 

EDIT:

При добавлении

gbc.weightx = 1; 
gbc.weighty = 1; 

Результат

GBC

+0

См: http://madbean.com/anim/totallygridbag/, а также http://www.miglayout.com/ избежать сходит с ума. –

+0

@Yar Спасибо за совет. Считаете ли вы, что это возможно с помощью GBL? –

+0

Да, возможно, это возможно. Но MigLayout заставляет всех радоваться вечно и всегда. –

ответ

1

Ваша проблема связана с вашей Габаритные размеры.

Не используйте только «предпочтительные». Используйте минимум.

explorerPanel = new JPanel(); 
explorerPanel.setBackground(Color.BLACK); 
explorerPanel.setMinimumSize(new Dimension(250, 300)); 
explorerPanel.setPreferredSize(new Dimension(250, 300)); 

tagPanel = new JPanel(); 
tagPanel.setBackground(Color.yellow); 
tagPanel.setMinimumSize(new Dimension(250, 300)); 
tagPanel.setPreferredSize(new Dimension(250, 300)); 

secondaryPanel = new JPanel(); 
secondaryPanel.setBackground(Color.blue); 
secondaryPanel.setMinimumSize(new Dimension(500, 600)); 
secondaryPanel.setPreferredSize(new Dimension(500, 600)); 

mainPanel = new JPanel(); 
mainPanel.setPreferredSize(new Dimension(750, 600)); 
mainPanel.setMinimumSize(new Dimension(750, 600)); 
mainPanel.setLayout(new GridBagLayout()); 

Это работало в моем тесте: enter image description here

+1

Это удовлетворительно :) Merci Olivier de Bruxelles. Вас тепло поблагодарили. –

+1

Возможно, вы захотите использовать 'GridBagConstraints.fill'. Я почти не касался GBL/GBC годами, но я помню, что это было как-то важно. –

+0

определенно сделает. Хороший вечер –

0

Вы можете исправить это с помощью BorderLayout

Вместо этого:

this.setContentPane(mainPanel); 

Вы можете сделать это:

getContentPane().add(mainPanel, BorderLayout.CENTER); 
+0

Я пробовал это также перед публикацией, но не работал, но спасибо за ответ. –

2

Вам нужно комплект GridBagConstraints.weightx и GridBagConstraints.weighty к чему-то ненулевым:

От documentation

GridBagConstraints.weightx, GridBagConstraints.weighty

Используется для определения того, как распределить пространство, которое имеет важное значение для определения изменения размеров поведения , Если вы не укажете вес по меньшей мере для одного компонента в строке (weightx) и столбце (весомый), все компоненты объединяются в центре их контейнера. Это связано с тем, что когда вес равен нулю (по умолчанию), объект GridBagLayout помещает дополнительное пространство между сеткой ячеек и краями контейнера.

Установка его на 1 для всех компонентов должна работать нормально, если вы хотите, чтобы все они заполнили пространство.

также есть дополнительные пояснения к этим полям на Oracle tutorial page, которые вы были связаны под заголовком weightx, weighty.

EDIT:

Кроме того, необходимо установить fill для компонентов, в противном случае по умолчанию NONE:

GridBagConstraints.fill

Используется, когда область дисплея компонента будет больше чем запрошенный размер компонента для определения того, (или как) изменить размер компонента. Возможные значения: GridBagConstraints.NONE (по умолчанию), GridBagConstraints.HORIZONTAL (сделать компонент достаточно широким, чтобы заполнить его область отображения по горизонтали, но не изменять его высоту), GridBagConstraints.VERTICAL (сделать компонент достаточно высоким, чтобы заполнить его область отображения вертикально, но не меняйте его ширину), и GridBagConstraints.BOTH (сделайте компонент полностью заполняющим область отображения).

Вот что я получаю, установив weightx в 0.33 для explorerPanel и tagPanel и 0.66 для secondaryPanel и установки fill в GridBagConstraints.BOTH для всех из них:

enter image description here

+0

Не работал ни один, я попробовал это и перед публикацией. Посмотрите на мое редактирование. –

+0

@YassinHajaj Я добавил (а) ссылку редактировать – gla3dr

+0

Спасибо glad3dr. Он отвечает на часть вопроса, но пропорции от панелей более уважаются в другом ответе. Приобретено. Еще раз спасибо за помощь за помощь. :) –

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