2016-09-21 4 views
0

Ich erstelle einen JFrame mit 4 JPanels. Mit GridBagLayout erstelle ich drei Zeilen und zwei Spalten, zwei Bereiche pro Spalte. Wenn ich die Zellenhöhe des blauen Feldes von 1 auf 2 ändere, kann ich die darunter liegende Zelle abdecken. Ich möchte das gleiche für das grüne Panel tun, um den Raum darunter zu füllen. Hier ist, was zur Zeit mein Code erzeugt:GridBagLayout - Wie kann ich diese Zelle füllen den Raum darunter?

enter image description here

Ich habe versucht, den grünen Panels gridheight auf 2 ändern, aber ich mit diesem Ende:

enter image description here

Bin ich GridBagLayout falsch verwenden? Was ist der geeignete Weg, dies zu tun?

Hier ist mein Code:

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

Für eine bessere Hilfe früher, Posten [MCVE ] oder [Kurzes, eigenständiges, korrektes Beispiel] (http://www.sscce.org/). –

+0

Danke Andrew. Ich habe den Rest des Codes hinzugefügt. –

+0

Hinweis: Es beginnt sich wie erwartet zu verhalten, wenn es eine dritte Spalte mit drei Zellen mit jeweils einer Zeilenspanne von 1 gibt. –

Antwort

2

ich drei Zeilen und zwei Spalten zu erstellen,

Eigentlich nur zwei Reihen haben, da man immer nur Komponenten hinzufügen, mit einem gridy Wert von 0 und 1. Die Tatsache, dass eine der Komponenten eine Rasterhöhe von 2 hat, erzeugt keine neue Zeile.

Eine Lösung besteht darin, verschachtelte Panels zu verwenden.

Erstellen Sie ein Panel für die blauen und gelben Komponenten. Dies würde ein GridBagLayout mit einer Spalte und zwei Zeilen verwenden. Sie legen dann die gewichtigen Werte für jede Komponente fest, um die gewünschte Höhe zu erhalten.

Dann erstellen Sie erneut ein zweites Panel für die roten und grünen Komponenten mit 1 Spalte und 2 Zeilen. Das Gewicht würde auf 0,5 für jeden festgelegt werden.

Schließlich erstellen Sie ein drittes Panel mit 2 Spalten und einer Zeile. Sie legen das gewünschte Gewicht fest und fügen die obigen zwei Felder zu diesem Feld hinzu und fügen dann das Feld dem Bild hinzu.

+0

Ich konnte das gewünschte Format erhalten, indem ich Panels verschachtelte. Vielen Dank! Aber Sie sagten, dass ich "nur Komponenten mit einem Rasterwert von 0 und 1 hinzufüge" - mein gelbes Feld verwendete einen Rasterwert von 2. –

+0

@TomBrannan, Sorry, ich meinte, Sie können nicht einfach Rasterwerte erstellen. Sie können kein Raster von 0 und dann ein Raster von 10 haben und erwarten, dass der Layout-Manager Platz für die anderen 9 Raster zwischen den beiden Werten einfügt. Deshalb müssen Sie die Panels so verschachteln, wie ich es vorgeschlagen habe, oder Dummy-Komponenten hinzufügen, um jedes Gitter zu belegen, wie Andrew vorgeschlagen hat. – camickr

2

Das Layout beginnt wie erwartet zu verhalten, wenn es eine dritte Spalte von drei Zellen, die jeweils mit einer Reihe Spannweite von 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); 
    } 
} 
Verwandte Themen