我在这里读到了很多关于这个问题的信息。但是我似乎并没有找到解决这个问题的方法。我尝试过的所有解决方案均无效。
但是让我们从头开始:我正在使用Swing构建我的界面,并试图实现模块化。所以我的左主菜单有一个类(扩展了JPanel)。该菜单是通过GridBagLayout中的几个按钮构建的。
但是我无法使此布局与窗口(面板)的顶部对齐。示例:面板顶部的标签,下方的文本字段,文字字段下方的按钮,等等。
请查看我的代码:
public class LeftMenu extends JPanel {
public LeftMenu(){
GridBagLayout gbl_panel = new GridBagLayout();
gbl_panel.columnWidths = new int[] { 86, 0 };
gbl_panel.rowHeights = new int[] {32, 32, 32, 32, 32, 32, 32, 32, 32 };
gbl_panel.columnWeights = new double[] { 0.0, Double.MIN_VALUE };
gbl_panel.rowWeights = new double[] { 0.0, 0.0, 0.0, 0.0, 0.0 };
setLayout(gbl_panel);
JLabel lblEnterTrunkId = new JLabel("Enter Trunk ID");
GridBagConstraints gbc_lblEnterTrunkId = new GridBagConstraints();
gbc_lblEnterTrunkId.fill = GridBagConstraints.HORIZONTAL;
gbc_lblEnterTrunkId.insets = new Insets(0, 0, 5, 0);
gbc_lblEnterTrunkId.gridx = 0;
gbc_lblEnterTrunkId.gridy = 0;
gbc_lblEnterTrunkId.anchor = GridBagConstraints.NORTH;
add(lblEnterTrunkId, gbc_lblEnterTrunkId);
}
}
标签后面有一个文本字段和一些按钮。但我认为这些都不相关...如果它们是...,则它们看起来大多像标签(只是它们不是标签...我想您明白了)
我阅读的所有指南都指向GridBagConstraint的锚点。它在那里....但是不起作用。它在面板中间完美对齐。
如果有关系:Panel用作SplitPane的LeftComponent:
public LeftMenu leftpanel = new LeftMenu();
splitPaneTrunks.setLeftComponent(leftpanel);
期待您的帮助。
这里是我的侧菜单的图片...水平居中。不应该的。
代替使用GridBagLayout
,您可以使用布局为JPanel
的BorderLayout
进行换行,如下所示:
setLayout(new BorderLayout());
JPanel gridBagWrap = new JPanel();
GridBagLayout gbl_panel = new GridBagLayout();
gbl_panel.columnWidths = new int[] { 86, 0 };
gbl_panel.rowHeights = new int[] {32, 32, 32, 32, 32, 32, 32, 32, 32 };
gbl_panel.columnWeights = new double[] { 0.0, Double.MIN_VALUE };
gbl_panel.rowWeights = new double[] { 0.0, 0.0, 0.0, 0.0, 0.0 };
gridBagWrap.setLayout(gbl_panel);
JLabel lblEnterTrunkId = new JLabel("Enter Trunk ID");
GridBagConstraints gbc_lblEnterTrunkId = new GridBagConstraints();
gbc_lblEnterTrunkId.fill = GridBagConstraints.HORIZONTAL;
gbc_lblEnterTrunkId.insets = new Insets(0, 0, 5, 0);
gbc_lblEnterTrunkId.gridx = 0;
gbc_lblEnterTrunkId.gridy = 0;
gbc_lblEnterTrunkId.anchor = GridBagConstraints.NORTH;
gridBagWrap.add(lblEnterTrunkId, gbc_lblEnterTrunkId);
add(gridBagWrap, BorderLayout.NORTH);
这是我的侧菜单的图片...水平居中。不应该的。
我想您的意思是,如果要从顶部显示组件,则不应垂直居中。
无论如何,我认为问题是您的weighty
约束。对于至少一个组件,它必须为非零,否则组件将垂直居中。
阅读有关How to Use GridBagLayout的Swing教程中的部分。有一个关于weightx / weighty约束的部分将对此进行更详细的说明。
[GridBagLayout
经理,您迷路了,这并不奇怪。实际上,它是它最常提到的功能之一。 GridBagLayout
来自90年代,并且在组件之间使用像素固定的间隙,该间隙不可移植。使用该管理器,您必须繁琐地定义布局的每个单元格;难怪人们会感到困惑。
我建议使用MigLayout
。如果无法使用,则选择GroupLayout
。
这里是MigLayout
的解决方案:
package com.zetcode;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import net.miginfocom.swing.MigLayout;
/*
Demonstration of MigLayout manager.
Author: Jan Bodnar
Website: zetcode.com
*/
public class MigLayoutTrunkEx extends JFrame {
public MigLayoutTrunkEx() {
initUI();
}
private void initUI() {
JLabel lbl = new JLabel("Enter Trunk ID");
JTextField textField = new JTextField(10);
JButton btn1 = new JButton("A");
JButton btn2 = new JButton("B");
JButton btn3 = new JButton("C");
JButton btn4 = new JButton("D");
JButton btn5 = new JButton("E");
JTextArea area = new JTextArea(20, 25);
area.setBorder(BorderFactory.createEtchedBorder());
JLabel statusBar = new JLabel("Ready");
createLayout(lbl, textField, btn1, btn2, btn3,
btn4, btn5, area, statusBar);
setTitle("MigLayout example");
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
private void createLayout(JComponent... arg) {
setLayout(new MigLayout("", "[align center]", ""));
add(arg[0], "split 7, flowy");
add(arg[1]);
add(arg[2]);
add(arg[3]);
add(arg[4]);
add(arg[5]);
add(arg[6]);
add(arg[7], "grow, push, wrap");
add(arg[8], "align left, growx, spanx");
pack();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
MigLayoutTrunkEx ex = new MigLayoutTrunkEx();
ex.setVisible(true);
});
}
}
很容易,一旦您知道MigLayout
。工作十到十五分钟。
截屏: