2016-02-22 1 views
0

Я хочу, чтобы первый ряд из трех компонентов был разнесен с весами 1,0,5,0,5. Поэтому первый компонент должен быть в два раза длиннее остальных. Во второй строке я хочу, чтобы все три компонента имели вес 0,5 (одинаковая длина). GridBagLayout ведет себя странно.GridBagLayout не меняется для каждой строки

public class Main extends JFrame{ 

public Main() { 
     super(); 

     this.setLayout(new GridBagLayout()); 
     GridBagConstraints c = new GridBagConstraints(); 

     c.fill = GridBagConstraints.HORIZONTAL; 

     JLabel label = new JLabel("Label 1"); 
     c.weightx = 1.0; 
     c.gridx = 0; 
     c.gridy = 0; 
     label.setBorder(BorderFactory.createLineBorder(Color.red)); 
     this.add(label, c); 

     JLabel label2= new JLabel("Label 2"); 
     c.weightx = 0.5; 
     c.gridx = 1; 
     c.gridy = 0; 
     label2.setBorder(BorderFactory.createLineBorder(Color.red)); 
     this.add(label2, c); 

     JLabel label3= new JLabel("Label 3"); 
     c.weightx = 0.5; 
     c.gridx = 2; 
     c.gridy = 0; 
     label3.setBorder(BorderFactory.createLineBorder(Color.red)); 
     this.add(label3, c); 

     JLabel label4 = new JLabel("1"); 
     c.weightx = 0.5; 
     c.gridx = 0; 
     c.gridy = 1; 
     label4.setBorder(BorderFactory.createLineBorder(Color.red)); 
     this.add(label4, c); 

     JLabel label5= new JLabel("2"); 
     c.weightx = 0.5; 
     c.gridx = 1; 
     c.gridy = 1; 
     label5.setBorder(BorderFactory.createLineBorder(Color.red)); 
     this.add(label5, c); 

     JLabel label6= new JLabel("3"); 
     c.weightx = 0.5; 
     c.gridx = 2; 
     c.gridy = 1; 
     label6.setBorder(BorderFactory.createLineBorder(Color.red)); 
     this.add(label6, c); 


     this.setSize(900,900); 
     this.setVisible(true); 

    } 
    public static void main(String[] args){ 
     new Main(); 
    } 
} 
+0

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

+0

И код работает точно так, как ожидалось – MadProgrammer

+0

Для меня вторая строка выглядит точно так же, как и первая строка –

ответ

4

Я хочу первый ряд из трех компонентов, которые будут растянуты с весами 1,0.5,0.5.

«Весы» применяются только при изменении размера рамки. То есть компоненты первоначально отображаются по своему предпочтительному размеру. Затем, когда вы увеличиваете пространство в кадре, дополнительное пространство выделяется в указанном вами соотношении.

Если вы хотите поддерживать коэффициент в любое время, вам также необходимо создать свои компоненты с предпочтительным размером в этом соотношении.

Или вы можете использовать Relative Layout. Он был разработан, чтобы избежать этой проблемы и позволяет указать относительные размеры для каждого компонента. Очевидно, вам нужно создать несколько панелей для каждой строки.

+0

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

+1

Каждый компонент определяет свой собственный предпочтительный размер, основываясь на свойствах компонентов. Учитывая, что текст отличается, предпочтительный размер будет другим. Кроме того, поскольку у вас есть сетка, макет должен установить размер для каждого столбца сетки. Вы не можете иметь разную ширину для столбца 1 в строке 2 и строке2. Поэтому в вашем простом примере ширина каждого столбца будет определяться первой строкой, так как эта строка содержит наибольшие компоненты. – camickr

+0

@ a.kumar Предпочтительный размер зависит от текста и свойств значков (и других) метки, 'weightx' и' weighty' определяет, как пространство слева распределяется по компонентам. – MadProgrammer

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