【发布时间】:2015-08-26 01:11:30
【问题描述】:
我有一个 JPanel,其中包含一些组件,并使用 FlowLayout 将它们布置好,以便在必要时将它们包装起来,并且我想将这个 JPanel 放在 JFrame 中。 我尝试将 BoxLayout 与 VerticalGlue 一起使用,但它并没有完全居中。 这是一个简单的 SSCCE,它演示了我的问题,因为我认为我不能很好地解释它:
import javax.swing.*;
public class Test extends JFrame {
public static void main(String[] args) {
new Test();
}
public Test() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
getContentPane().add(Box.createVerticalGlue());
JPanel panel = new JPanel();
panel.add(new JButton("New button"));
panel.add(new JButton("New button"));
getContentPane().add(panel);
setVisible(true);
}
}
如果窗口的宽度足以让两个按钮彼此相邻,则它几乎看起来居中:
但如果它太小你可以清楚地看到我的问题:
问题是 JPanel 占据了 JFrame 的下半部分,而 Glue 占据了上半部分:
我也尝试过其他的 LayoutManager,但我还不能解决这个问题。
编辑:
BorderLayout 和 JPanel 位于中心,按钮显示在顶部,因为 JPanel 扩展为 JFrame 的 ContentPane 的大小:
使用 GridBagLayout,它看起来很完美,所有东西都彼此相邻。但如果组件被包裹起来,它们就会消失:
使用 MigLayout,按钮将不再换行:
编辑: 我使用的解决方案是Wrap Layout 与 GridBagLayout 的组合:
import java.awt.*;
import javax.swing.*;
class Test extends JFrame {
public static void main(String[] args) {
new Test();
}
Test() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
GridBagLayout gridBagLayout = new GridBagLayout();
gridBagLayout.columnWeights = new double[]{1.0};
getContentPane().setLayout(gridBagLayout);
JPanel panel = new JPanel(new WrapLayout());
GridBagConstraints gbc_panel = new GridBagConstraints();
gbc_panel.fill = GridBagConstraints.HORIZONTAL;
getContentPane().add(panel, gbc_panel);
panel.add(new JButton("New button"));
panel.add(new JButton("New button"));
setVisible(true);
}
}
【问题讨论】:
-
我会尝试将 FlowLayout 嵌套在 BorderLayout 的中心...
-
如果这些是面板上唯一的组件,并且您想准确了解它们的位置,我建议使用 NullLayout (setLayout(null)) 并使用 setBounds()。 docs.oracle.com/javase/tutorial/uiswing/layout/none.html为了解决你的大小调整问题,只需让setBounds()方法的参数与JFrame的大小成比例即可。
-
@javaislife
I would suggest using NullLayout (setLayout(null)) and utilizing setBounds().:最糟糕的建议。永远不要使用空布局!只需使用 gridbaglayout 将面板包装到周围的面板中,默认约束将执行 OP 想要的操作 -
我会为此使用
MigLayout,对于任何其他情况。
标签: java swing jpanel layout-manager