2016-05-23 70 views
1

在以下GroupLayout中,兩列(紅色和橙色)具有獨立的垂直對齊,除了它們共享相同的整體高度和位置。填充GroupLayout中的多個列

Desired layout

無間隙被添加的底部橙色項目下方,該項目變成垂直拉伸以匹配紅色塔的整體高度。這是不可接受的(這是一個JComboBox,看起來很可怕)。我發現的唯一解決方案是添加一個固定的高度差距(橙色項目的底部),精確尺寸。有沒有辦法動態地解決這個問題(即不使用常量)?

+2

'GroupLayout的是,是爲GUI構建器,如Matisse'開發佈局管理器,它也一直在SpringLayout將對取代。考慮爲此使用GUI構建器,並考慮升級到SpringLayout。 (P.S.我們可以使用你的代碼。) – markspace

+1

@markspace:關於[mcve]的好處; 'GroupLayout'自1.6開始; SpringLayout自1.4開始。 – trashgod

回答

1

答案在於addComponent()方法。它還有三個額外的 參數,即組件的最小值,首選值和最大值。 對於JComboBox不能垂直拉伸,您必須在垂直組中將最大尺寸設置爲GroupLayout.PREFERRED_SIZE

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); 
     }); 
    } 
} 

下面是截圖:

enter image description here