1
在以下GroupLayout中,兩列(紅色和橙色)具有獨立的垂直對齊,除了它們共享相同的整體高度和位置。填充GroupLayout中的多個列
無間隙被添加的底部橙色項目下方,該項目變成垂直拉伸以匹配紅色塔的整體高度。這是不可接受的(這是一個JComboBox,看起來很可怕)。我發現的唯一解決方案是添加一個固定的高度差距(橙色項目的底部),精確尺寸。有沒有辦法動態地解決這個問題(即不使用常量)?
在以下GroupLayout中,兩列(紅色和橙色)具有獨立的垂直對齊,除了它們共享相同的整體高度和位置。填充GroupLayout中的多個列
無間隙被添加的底部橙色項目下方,該項目變成垂直拉伸以匹配紅色塔的整體高度。這是不可接受的(這是一個JComboBox,看起來很可怕)。我發現的唯一解決方案是添加一個固定的高度差距(橙色項目的底部),精確尺寸。有沒有辦法動態地解決這個問題(即不使用常量)?
答案在於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);
});
}
}
下面是截圖:
'GroupLayout的是,是爲GUI構建器,如Matisse'開發佈局管理器,它也一直在SpringLayout將對取代。考慮爲此使用GUI構建器,並考慮升級到SpringLayout。 (P.S.我們可以使用你的代碼。) – markspace
@markspace:關於[mcve]的好處; 'GroupLayout'自1.6開始; SpringLayout自1.4開始。 – trashgod