2016-09-21 18 views
0

Я создаю JFrame с 4 JPanels. Используя GridBagLayout, я создаю три строки и два столбца, по две панели на столбец. Изменяя силовую ячейку синей панели от 1 до 2, я могу заставить ее покрыть ячейку под ней. Я хотел бы сделать то же самое для зеленой панели, чтобы заполнить пространство под ней. Вот что в настоящее время производит мой код:GridBagLayout - Как я могу сделать эту ячейку заполнять пространство под ней?

enter image description here

Я попытался изменить gridheight зеленой панели на 2, но я в конечном итоге с этим:

enter image description here

Пользуюсь ли я GridBagLayout неправильно? Каков подходящий способ сделать это?

Вот мой код:

import java.awt.Color; 
import java.awt.Container; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Insets; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Main { 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     addComponents(frame.getContentPane()); 
     frame.setSize(800, 600); 
     frame.setVisible(true); 
    } 

    public static void addComponents(Container contentPane) { 
     contentPane.setLayout(new GridBagLayout()); 
     GridBagConstraints c = new GridBagConstraints(); 
     c.insets = new Insets(3,3,3,3); 
     c.fill = GridBagConstraints.BOTH; 

     c.gridx = 0; 
     c.gridy = 0; 
     c.gridwidth = 1; 
     c.gridheight = 2; 
     c.weightx = 1; 
     c.weighty = 0.85; 
     JPanel panel1 = new JPanel(); 
     panel1.setBackground(Color.BLUE); 
     contentPane.add(panel1, c); 

     c.gridx = 0; 
     c.gridy = 2; 
     c.gridwidth = 1; 
     c.gridheight = 1; 
     c.weightx = 1.1; 
     c.weighty = 0.35; 
     JPanel panel2 = new JPanel(); 
     panel2.setBackground(Color.YELLOW); 
     contentPane.add(panel2, c); 

     c.gridx = 1; 
     c.gridy = 0; 
     c.gridwidth = 1; 
     c.gridheight = 1; 
     c.weightx = 0.15; 
     c.weighty = 0.5; 
     JPanel panel3 = new JPanel(); 
     panel3.setBackground(Color.RED); 
     contentPane.add(panel3, c); 

     c.gridx = 1; 
     c.gridy = 1; 
     c.gridwidth = 1; 
     c.gridheight = 1; 
     c.weightx = 0.38; 
     c.weighty = 0.5; 
     JPanel panel4 = new JPanel(); 
     panel4.setBackground(Color.GREEN); 
     contentPane.add(panel4, c); 
    } 
} 
+0

Для лучшей помощи рано, опубликовать [MCVE ] или [Short, Self Contained, Correct Example] (http://www.sscce.org/). –

+0

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

+0

Примечание: он начинает вести себя так, как ожидалось, если есть 3-й столбец из трех ячеек, каждый с диапазоном строк 1. –

ответ

2

создать три строки и два столбца,

На самом деле у вас есть только два ряда, так как вы только когда-либо добавлять компоненты с Gridy значением 0 и 1. Тот факт, что один из компонентов имеет сетку из 2, не создает новую строку.

Одним из решений является использование вложенных панелей.

Создайте панель для синих и желтых компонентов. Это будет использовать GridBagLayout с одним столбцом и двумя строками. Затем вы устанавливаете весомые значения для каждого компонента, чтобы дать желаемую высоту.

Затем вы создаете вторую панель для красных и зеленых компонентов с 1 столбиком и двумя рядами. Весомый будет установлен на 0,5 для каждого.

Наконец, вы создаете третью панель с двумя столбцами и одной строкой. Вы устанавливаете желаемый вес и добавляете эти две панели к этой панели, а затем добавляете панель в рамку.

+0

Мне удалось получить формат, который мне нужен, с помощью гнездовых панелей. Благодаря! Но вы сказали, что я «только когда-либо добавляю компоненты с сетевым значением 0 и 1» - моя желтая панель использовала сетевое значение 2. –

+0

@TomBrannan, Извините, я имел в виду, что вы не можете просто составлять значения сетки. Вы не можете иметь сетку из 0, а затем сетку из 10 и ожидать, что менеджер компоновки будет вставлять пространство для остальных 9 сеток между этими двумя значениями. Вот почему вам нужно вложить панели, как я предложил, или добавить фиктивные компоненты, чтобы занять каждую сетку, как предложил Эндрю. – camickr

2

Компоновка начинает вести себя, как и ожидалось, если есть 3-й столбец трех ячеек, каждая из которых с пролетом строки из 1.

enter image description hereenter image description here

import java.awt.*; 
import javax.swing.*; 
import javax.swing.border.EmptyBorder; 

public class AnotherFourPanelLayout { 

    private JComponent ui = null; 

    AnotherFourPanelLayout() { 
     initUI(); 
    } 

    public void initUI() { 
     if (ui != null) { 
      return; 
     } 

     ui = new JPanel(new BorderLayout(4, 4)); 
     ui.setBorder(new EmptyBorder(4, 4, 4, 4)); 

     addComponents(ui); 
    } 

    public void addComponents(Container contentPane) { 
     contentPane.setLayout(new GridBagLayout()); 
     GridBagConstraints c = new GridBagConstraints(); 
     c.insets = new Insets(3, 3, 3, 3); 
     c.fill = GridBagConstraints.BOTH; 

     c.gridx = 0; 
     c.gridy = 0; 
     c.gridwidth = 1; 
     c.gridheight = 2; 
     c.weightx = 0.66; 
     c.weighty = 0.66; 
     JPanel panel1 = new JPanel(); 
     addLabel(panel1, c); 
     panel1.setBackground(Color.CYAN); 
     contentPane.add(panel1, c); 

     c.gridx = 0; 
     c.gridy = 2; 
     c.gridwidth = 1; 
     c.gridheight = 1; 
     //c.weightx = 1.1; // logical? 
     c.weightx = 0.66; 
     c.weighty = 0.33; 
     JPanel panel2 = new JPanel(); 
     addLabel(panel2, c); 
     panel2.setBackground(Color.YELLOW); 
     contentPane.add(panel2, c); 

     c.gridx = 1; 
     c.gridy = 0; 
     c.gridwidth = 1; 
     c.gridheight = 1; 
     c.weightx = 0.33; 
     c.weighty = 0.33; 
     JPanel panel3 = new JPanel(); 
     addLabel(panel3, c); 
     panel3.setBackground(Color.RED); 
     contentPane.add(panel3, c); 

     c.gridx = 1; 
     c.gridy = 1; 
     c.gridwidth = 1; 
     c.gridheight = 2; 
     c.weightx = 0.33; 
     c.weighty = 0.66; 
     JPanel panel4 = new JPanel(); 
     addLabel(panel4, c); 
     panel4.setBackground(Color.GREEN); 
     contentPane.add(panel4, c); 

     // hack to fix? 
     c.gridx = 2; 
     c.gridy = 0; 
     c.gridwidth = 1; 
     c.gridheight = 1; 
     c.weightx = 0.01; 
     c.weighty = 0.33; 
     JPanel panelH1 = new JPanel(); 
     //addLabel(panelH1, c); 
     panelH1.setBackground(Color.MAGENTA); 
     contentPane.add(panelH1, c); 

     c.gridy = 1; 
     JPanel panelH2 = new JPanel(); 
     //addLabel(panelH2, c); 
     panelH2.setBackground(Color.MAGENTA); 
     contentPane.add(panelH2, c); 

     c.gridy = 2; 
     JPanel panelH3 = new JPanel(); 
     //addLabel(panelH3, c); 
     panelH3.setBackground(Color.MAGENTA); 
     contentPane.add(panelH3, c); 
    } 

    private void addLabel(JPanel panel, GridBagConstraints gbc) { 
     panel.add(new JLabel(constraintsToString(gbc))); 
    } 

    private String constraintsToString(GridBagConstraints gbc) { 
     StringBuilder sb = new StringBuilder(); 

     sb.append("<html><table>"); 
     sb.append(addRowToTable("Grid X", gbc.gridx)); 
     sb.append(addRowToTable("Grid Y", gbc.gridy)); 
     sb.append(addRowToTable("Weight X", gbc.weightx)); 
     sb.append(addRowToTable("Weight Y", gbc.weighty)); 
     sb.append(addRowToTable("Grid Width", gbc.gridwidth)); 
     sb.append(addRowToTable("Grid Height", gbc.gridheight)); 

     return sb.toString(); 
    } 

    private String addRowToTable(String label, double value) { 
     StringBuilder sb = new StringBuilder("<tr><td>"); 

     sb.append(label); 
     sb.append("</td><td>"); 
     sb.append(value); 
     sb.append("</td></tr>"); 


     return sb.toString(); 
    } 

    public JComponent getUI() { 
     return ui; 
    } 

    public static void main(String[] args) { 
     Runnable r = new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (Exception useDefault) { 
       } 
       AnotherFourPanelLayout o = new AnotherFourPanelLayout(); 

       JFrame f = new JFrame(o.getClass().getSimpleName()); 
       f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       f.setLocationByPlatform(true); 

       f.setContentPane(o.getUI()); 
       f.pack(); 
       f.setMinimumSize(f.getSize()); 

       f.setVisible(true); 
      } 
     }; 
     SwingUtilities.invokeLater(r); 
    } 
}