我一直在使用WindowBuilder Pro for Java Swing 布局,遇到了一些奇怪的行为,我最终能够将其简化为 SSCCE。考虑下面的源代码:
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
绿色的 ,都会向右浮动。玩弄了代码中的一些参数,我只能找到两种方法彻底杀死绿色面板左侧的缝隙:
- 将构造函数中的
hgap
and更改为 0。vgap
panel_2
或者
minimumSize
将of更改panel_2
为 (0,0)。
做其中任何一个,我们得到这个:
现在,问题是,到底为什么inminimumSize
或in与阻止填充到其父对象的左侧hgap
有任何关系?如果我碰巧想要一个大于零和大于零的我的 in怎么办?那么我将如何消除in左侧的间隙?FlowLayout
panel_2
panel_1
minimumSize
hgap
FlowLayout
panel_2
BoxLayout
panel_1
无论我做什么panel_1
,我都不能让它填满其父容器的整个宽度(除非我panel_2
按照上面的描述进行编辑)。具有讽刺意味的是,如果我将 for 设置alignmentX
为panel_1
,RIGHT_ALIGNMENT
它实际上会向左浮动。但差距仍然存在(就在右边)。当我填充panel_1
内容并增加它的大小时,它右侧的间隙变得越来越小,但从未完全消失,令人沮丧。
这不仅仅发生在panel_2
is a FlowLayout
... 它还发生在JScrollPane
和许多其他类型... 通常没有hgap
参数的类型,这意味着修复左侧间隙的唯一方法panel_1
是更改新容器minimumSize
为 0,这又显得愚蠢且不相关,最重要的是可能不是我的设计意图。