2015-06-14 13 views
5

Quindi quello che sto cercando di fare è creare questa: enter image description hereproblemi con GridBagLayout e pannelli

Sto usando un layout GridBag e qui è quello che ho finora:

public class board { 
public static void addComponentsToPane(Container pane) { 
    pane.setLayout(new GridBagLayout()); 
    GridBagConstraints c = new GridBagConstraints(); 

    JPanel leftTop = new JPanel(); 
    leftTop.setPreferredSize(new Dimension(251,300)); 
    leftTop.setBackground(Color.black); 
    c.fill = GridBagConstraints.HORIZONTAL; 
    c.gridx = 0; 
    c.gridy = 0; 

    pane.add(leftTop, c); 

    JPanel middleTop = new JPanel(); 
    middleTop.setPreferredSize(new Dimension(251,200)); 
    middleTop.setBackground(Color.green); 
    c.fill = GridBagConstraints.HORIZONTAL; 
    c.gridx = 1; 
    c.gridy = 0; 

    pane.add(middleTop, c); 

    JPanel rightTop = new JPanel(); 
    rightTop.setPreferredSize(new Dimension(251,600)); 
    rightTop.setBackground(Color.blue); 
    c.fill = GridBagConstraints.HORIZONTAL; 
    c.gridx = 2; 
    c.gridy = 0; 

    pane.add(rightTop, c); 

    JPanel leftBottom = new JPanel(); 
    leftBottom.setPreferredSize(new Dimension(251,300)); 
    leftBottom.setBackground(Color.red); 
    c.fill = GridBagConstraints.HORIZONTAL; 
    c.gridx = 0; 
    c.gridy = 1; 

    pane.add(leftBottom, c); 

    JPanel middleBottom = new JPanel(); 
    middleBottom.setPreferredSize(new Dimension(251,400)); 
    middleBottom.setBackground(Color.yellow); 
    c.fill = GridBagConstraints.HORIZONTAL; 
    c.gridx = 1; 
    c.gridy = 1; 

    pane.add(middleBottom, c); 
} 

private static void createAndShowGUI() { 
    JFrame frame = new JFrame("GridBagLayoutDemo"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    addComponentsToPane(frame.getContentPane()); 

    frame.pack(); 
    frame.setVisible(true); 
} 

public static void main(String[] args) { 
    javax.swing.SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGUI(); 
     } 
    }); 
} 
} 

Si crea qualcosa di simile : enter image description here

Come spingere verso l'alto i pannelli in modo che si tocchino l'un l'altro come nella prima immagine. Ho guardato attraverso GridBagConstraints ma non sono riuscito a trovare nulla che sembrasse funzionasse. Grazie!

+0

È possibile ridimensionare il pannello principale? In tal caso, come ti aspetti che i componenti crescano e si riducano: tutti i componenti vengono ridimensionati proporzionalmente o alcuni componenti rimangono di dimensioni fisse mentre altri crescono e si restringono? –

risposta

4

Invece di provare a risolvere il problema di layout completo con un gestore di layout, è spesso più semplice annidare i layout. Ad esempio, il codice di esempio potrebbe essere modificato per utilizzare un layout di griglia orizzontale (per mantenere le colonne di larghezza uguale - in realtà non so se si vuole forzare. Se no, allora FlowLayout o BoxLayout sarebbe meglio), e il colonne utilizzano un BoxLayout ciascuno:

import java.awt.Color; 
import java.awt.Container; 
import java.awt.Dimension; 
import java.awt.GridLayout; 

import javax.swing.BoxLayout; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class board { 
    public static void addComponentsToPane(Container pane) { 
     pane.setLayout(new GridLayout(1, 0)); 

     JPanel left = new JPanel(); 
     pane.add(left); 
     left.setLayout(new BoxLayout(left, BoxLayout.Y_AXIS)); 

     JPanel leftTop = new JPanel(); 
     leftTop.setPreferredSize(new Dimension(125, 150)); 
     leftTop.setBackground(Color.black); 
     left.add(leftTop); 

     JPanel leftBottom = new JPanel(); 
     leftBottom.setPreferredSize(new Dimension(125, 150)); 
     leftBottom.setBackground(Color.red); 
     left.add(leftBottom); 

     JPanel middle = new JPanel(); 
     pane.add(middle); 
     middle.setLayout(new BoxLayout(middle, BoxLayout.Y_AXIS)); 

     JPanel middleTop = new JPanel(); 
     middleTop.setPreferredSize(new Dimension(125, 100)); 
     middleTop.setBackground(Color.green); 
     middle.add(middleTop); 

     JPanel middleBottom = new JPanel(); 
     middleBottom.setPreferredSize(new Dimension(125, 200)); 
     middleBottom.setBackground(Color.yellow); 
     middle.add(middleBottom); 

     JPanel right = new JPanel(); 
     right.setPreferredSize(new Dimension(125, 300)); 
     right.setBackground(Color.blue); 

     pane.add(right); 
    } 

    private static void createAndShowGUI() { 
     JFrame frame = new JFrame("GridBagLayoutDemo"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     addComponentsToPane(frame.getContentPane()); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 
} 

Risultati in:

Screenshot of the result

(i modifica le dimensioni preferite un po 'per rendere l'immagine più piccola Come ulteriore nota di solito è meglio override getPreferredSize() rather than use setPreferredSize(); setPreferredSize.() è conveniente per l'esempio veloce però)

+0

Mi spiace di non aver risposto Ero addormentato, ma funziona molto bene grazie per l'aiuto! – user2747058