2016-05-23 16 views
1

Im folgenden GroupLayout haben die beiden Spalten (rot und orange) eine unabhängige vertikale Ausrichtung, mit der Ausnahme, dass sie die gleiche Gesamthöhe und -position aufweisen.Auffüllen mehrerer Spalten in GroupLayout

Desired layout

ohne Spalt unterhalb der Bodenorangen Element hinzugefügt wird, wird das Element vertikal gestreckt, um die Gesamthöhe der roten Spalte passen. Das ist inakzeptabel (es ist eine JComboBox und sieht schrecklich aus). Die einzige Lösung, die ich gefunden habe, ist eine feste Höhe Lücke (bis zum Boden der orange Elemente), die genau bemessen ist. Gibt es eine Möglichkeit, dieses Problem dynamisch zu lösen (d. H. Ohne Konstanten zu verwenden)?

+2

'Grouplayout ist ein Layout-Manager, der für die GUI-Builder, wie Matisse' entwickelt wurde, und es ist auch durch SpringLayout ersetzt. Erwägen Sie, hierfür einen GUI-Builder zu verwenden und erwägen Sie ein Upgrade auf SpringLayout. (P.S. Wir könnten Ihren Code dafür verwenden.) – markspace

+1

@markspace: Guter Punkt über ein [mcve]; 'GroupLayout' seit 1.6; 'SpringLayout' seit 1.4. – trashgod

Antwort

1

Die Antwort liegt in der addComponent() Methode. Es hat drei zusätzliche Parameter, nämlich minimale, bevorzugte und maximale Größe der Komponente. Für die JComboBox nicht vertikal zu dehnen, müssen Sie die maximale Größe auf GroupLayout.PREFERRED_SIZE in der vertikalen Gruppe festlegen. Hier

package com.zetcode; 

import java.awt.Color; 
import java.awt.Container; 
import java.awt.EventQueue; 
import javax.swing.GroupLayout; 
import javax.swing.JComboBox; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import static javax.swing.JFrame.EXIT_ON_CLOSE; 
import javax.swing.JPanel; 

public class GroupLayoutMultipleColumns extends JFrame { 

    public GroupLayoutMultipleColumns() { 

     initUI(); 
    } 

    private void initUI() { 

     JPanel green1 = createPanel(new Color(60, 170, 70)); 
     JPanel green2 = createPanel(new Color(60, 170, 70)); 
     JPanel red1 = createPanel(new Color(230, 0, 50)); 
     JPanel red2 = createPanel(new Color(230, 0, 50)); 
     JPanel red3 = createPanel(new Color(230, 0, 50)); 
     JPanel red4 = createPanel(new Color(230, 0, 50)); 

     JComboBox combo1 = new JComboBox(); 
     JComboBox combo2 = new JComboBox(); 

     createLayout(green1, red1, red2, red3, red4, 
       combo1, combo2, green2); 

     setTitle("Multiple columns"); 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
    } 

    public JPanel createPanel(Color col) { 

     JPanel panel = new JPanel(); 
     panel.setBackground(col); 
     return panel; 
    } 

    private void createLayout(JComponent... arg) { 

     Container pane = getContentPane(); 
     GroupLayout gl = new GroupLayout(pane); 
     pane.setLayout(gl); 

     gl.setAutoCreateContainerGaps(true); 
     gl.setAutoCreateGaps(true); 

     gl.setHorizontalGroup(gl.createParallelGroup() 
       .addComponent(arg[0]) 
       .addGroup(gl.createSequentialGroup() 
         .addGroup(gl.createParallelGroup() 
           .addComponent(arg[1]) 
           .addComponent(arg[2]) 
           .addComponent(arg[3]) 
           .addComponent(arg[4])) 
         .addGroup(gl.createParallelGroup() 
           .addComponent(arg[5]) 
           .addComponent(arg[6]))) 
       .addComponent(arg[7]) 
     ); 

     gl.setVerticalGroup(gl.createSequentialGroup() 
       .addComponent(arg[0]) 
       .addGroup(gl.createSequentialGroup() 
         .addGroup(gl.createParallelGroup() 
           .addGroup(gl.createSequentialGroup() 
             .addComponent(arg[1]) 
             .addComponent(arg[2]) 
             .addComponent(arg[3]) 
             .addComponent(arg[4])) 
           .addGroup(gl.createSequentialGroup() 
             .addComponent(arg[5], GroupLayout.DEFAULT_SIZE, 
               GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) 
             .addComponent(arg[6], GroupLayout.DEFAULT_SIZE, 
               GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)))) 
       .addComponent(arg[7]) 
     ); 

     pack(); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(() -> { 
      GroupLayoutMultipleColumns ex = new GroupLayoutMultipleColumns(); 
      ex.setVisible(true); 
     }); 
    } 
} 

ist der Screenshot:

enter image description here