我一直在玩WindowBuilder Pro Java Swing佈局,並遇到一些奇怪的行爲,我最終能夠減少到SSCCE。考慮下面的代碼:這個Swing行爲是一個錯誤嗎?神祕的BoxLayout對齊
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class WBPTest2 {
private JFrame frame;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
WBPTest2 window = new WBPTest2();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public WBPTest2() {
initialize();
}
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
panel.setBackground(Color.RED);
frame.getContentPane().add(panel, BorderLayout.CENTER);
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
JPanel panel_1 = new JPanel();
panel_1.setBackground(Color.GREEN);
panel_1.setMaximumSize(new Dimension(32767, 100));
panel.add(panel_1);
panel_1.setLayout(new BoxLayout(panel_1, BoxLayout.Y_AXIS));
JPanel panel_2 = new JPanel();
panel_2.setBackground(Color.BLUE);
panel_2.setMaximumSize(new Dimension(32767, 100));
panel.add(panel_2);
panel_2.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));
}
}
它提供了以下佈局:
無論出於何種原因,panel_1
,綠色的,浮動的權利。與一些代碼的參數打,我只能找到兩種方式來徹底殺滅差距綠色面板的左側:
- 變化在
panel_2
構造的hgap
和vgap
爲0
OR
- 變化
panel_2
的minimumSize
到(0,0)。
做這類原因,我們得到這樣的:
現在的問題是,爲什麼在地球上無論是minimumSize
或hgap
在panel_2
的FlowLayout
有什麼關係防止panel_1
一直填充到其父項的左側?如果我碰巧想要minimumSize
大於零以及hgap
大於零,那麼我的FlowLayout
在panel_2
?那麼如何消除panel_1
中BoxLayout
左側的缺口?
無論什麼我做panel_1
,我不能讓它充滿其父容器的整個寬度(除非我編輯panel_2
如上所述)。具有諷刺意味的是,如果我將alignmentX
設置爲panel_1
到RIGHT_ALIGNMENT
,它實際上會浮到左側。但差距仍然存在(剛纔在右邊)。當我填充panel_1
內容並增加其大小時,其右側的差距越來越小,但從未完全消失,令人沮喪。
這時候panel_2
是FlowLayout
並不僅僅發生......也恰好與JScrollPane
和許多其他類型...類型的通常不具備hgap
參數,這意味着要彌補這個不足的唯一途徑在panel_1
的左邊是將新容器的minimumSize
更改爲0,這又似乎很愚蠢和無關,最重要的可能不是我的設計意圖。
爲了更快提供更好的幫助,請發佈[SSCCE](http://sscce.org/)。 *「我最終能夠減少到SSCCE。」*嗯......好。你最終會分享這個SSCCE嗎? –
@AndrewThompson對不起,猜我誤解了SSCCE,認爲主要方法就夠了。這裏是現在附加的完整源代碼。謝謝。 – The111
@AndrewThompson你是什麼意思'null'佈局? [Oracle教程](http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html#border)說:「每個內容窗格初始化爲使用BorderLayout。」所以我相信我的「框架」佈局不是空的?只是爲了咧嘴笑,我嘗試着通過構造函數明確地將其更改爲'BorderLayout',並且它仍然運行相同。另外,我不確定我是否理解你用'BufferedImage'提出的建議,抱歉。 – The111