另一个 GridBagLayout 对齐
Another GridBagLayout Alignment
我在这里读了很多关于这个问题的文章...但我似乎不知道如何解决这个问题。
我尝试的所有解决方案均无效。
但让我们从头开始:
我正在使用 Swing 构建我的界面并尝试模块化。
所以我的左主菜单有一个 class(扩展 JPanel)。
菜单是用 GridBagLayout 中的几个按钮构建的。
但我无法使此布局与 window(面板)的顶部对齐。
示例:面板顶部的标签、下方的文本字段、文本字段下方的按钮等
请看我的代码:
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 的锚点。它在那里....但不工作。
它在面板中间完美对齐。
如果重要的话:
用作 SplitPane 的 LeftComponent 的面板列表:
public LeftMenu leftpanel = new LeftMenu();
splitPaneTrunks.setLeftComponent(leftpanel);
期待您的帮助。
这是我的侧边菜单的图片...水平居中。因为它不应该。
除了使用 GridBagLayout
,您还可以使用布局 BorderLayout
的 JPanel
进行包装,如下所示:
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);
here is a picture of my side menu... centered horizontally. as it should not be.
我想你的意思是如果你想让组件从顶部显示,它不应该垂直居中。
无论如何,我认为问题出在您的 weighty
约束上。对于至少一个组件,它必须是非零的,否则组件将垂直居中。
阅读 How to Use GridBagLayout 上的 Swing 教程部分。关于 weightx/weighty 约束的部分将对此进行更详细的解释。
GridBagLayout
经理让您迷路也就不足为奇了。
它实际上是其最常提到的功能之一。 GridBagLayout
来自九十年代,在组件之间使用像素固定的间隙,这是不可移植的。使用此管理器,您必须繁琐地定义布局的每个单元格;难怪人们会感到困惑。
我推荐使用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
。十或十五分钟的工作。
截图:
我在这里读了很多关于这个问题的文章...但我似乎不知道如何解决这个问题。 我尝试的所有解决方案均无效。
但让我们从头开始: 我正在使用 Swing 构建我的界面并尝试模块化。 所以我的左主菜单有一个 class(扩展 JPanel)。 菜单是用 GridBagLayout 中的几个按钮构建的。
但我无法使此布局与 window(面板)的顶部对齐。 示例:面板顶部的标签、下方的文本字段、文本字段下方的按钮等
请看我的代码:
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 的锚点。它在那里....但不工作。 它在面板中间完美对齐。
如果重要的话: 用作 SplitPane 的 LeftComponent 的面板列表:
public LeftMenu leftpanel = new LeftMenu();
splitPaneTrunks.setLeftComponent(leftpanel);
期待您的帮助。
这是我的侧边菜单的图片...水平居中。因为它不应该。
除了使用 GridBagLayout
,您还可以使用布局 BorderLayout
的 JPanel
进行包装,如下所示:
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);
here is a picture of my side menu... centered horizontally. as it should not be.
我想你的意思是如果你想让组件从顶部显示,它不应该垂直居中。
无论如何,我认为问题出在您的 weighty
约束上。对于至少一个组件,它必须是非零的,否则组件将垂直居中。
阅读 How to Use GridBagLayout 上的 Swing 教程部分。关于 weightx/weighty 约束的部分将对此进行更详细的解释。
GridBagLayout
经理让您迷路也就不足为奇了。
它实际上是其最常提到的功能之一。 GridBagLayout
来自九十年代,在组件之间使用像素固定的间隙,这是不可移植的。使用此管理器,您必须繁琐地定义布局的每个单元格;难怪人们会感到困惑。
我推荐使用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
。十或十五分钟的工作。
截图: