Miglayout 中不跨越拆分单元格的组件
Components not spanning a split cell in Miglayout
我已阅读 Miglayout 快速入门指南和白皮书。我试图对对话框进行布局,以便所有复选框在两列中对齐,即使它们有时由单选按钮分隔。
我希望文本字段和分隔符跨越对话框的宽度,同时仍紧挨着它们的标签。文本区域也应该独占一行。我尝试拆分第一列并实现适当的间距,但是,组件不会 "span" 到下一列,即使使用关键字也是如此。
我认为这应该是可行的,因为快速入门指南说,
"It is of course possible to both span and split cells at the same time."
(第 2 页)
完整的代码示例如下。
public static void main(String[] args)
{
JFrame frame = new JFrame("Snack Selection");
JTextField d_msrField = new JTextField("Jane Doe");
d_msrField.setEnabled(false);
d_msrField.setColumns(30);
JPanel panel = new JPanel(new MigLayout("debug, wrap 2", "[]15[]"));
panel.add(new JLabel("Name:"), "gapbottom 11, gaptop 11, split 2");
panel.add(d_msrField, "span 2");
panel.add(new JRadioButton("Choose a Fruit"), "wrap");
panel.add(new JCheckBox("Apple"), "gapleft 18");
panel.add(new JCheckBox("Orange"));
panel.add(new JCheckBox("Pear"), "gapleft 18");
panel.add(new JCheckBox("Banana"));
panel.add(new JRadioButton("Choose a Vegetable"), "wrap");
panel.add(new JCheckBox("Celery"), "gapleft 18");
panel.add(new JCheckBox("Carrot"));
panel.add(new JRadioButton("Choose a Dairy Item"), "wrap");
panel.add(new JCheckBox("Milk"), "gapleft 18");
panel.add(new JCheckBox("Cheese"));
panel.add(new JLabel("Options"), "split 2");
panel.add(new JSeparator(), "span 2, growx");
JTextArea ta = new JTextArea(5, 30);
JScrollPane opts = new JScrollPane(ta);
panel.add(opts, "gapleft 18");
frame.setLayout(new BorderLayout());
frame.add(panel, BorderLayout.CENTER);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
编辑:为了解决这个问题,我在开头和 "wrap 3" 添加了一个额外的列,但我仍然很好奇是否有人知道为什么原始代码不起作用。
很高兴您使用 wrap 3
对其进行排序,但我认为您的主要问题是您如何使用 split, span
。
例如,如果您查看向面板添加内容的第一行
panel.add(new JLabel("Name:"), "gapbottom 11, gaptop 11, split 2");
panel.add(d_msrField, "span 2");
在这里你 split
第一个单元格(这实质上使该单元格成为网格中的子行),然后在你添加 d_msrField
时尝试 span
。 d_msrField
的问题已经是此 sub row
中的最后一个单元格,因此 span 不会执行任何操作。
您实际需要做的是跨越 sub row
.
panel.add(new JLabel("Name:"), "gapbottom 11, gaptop 11, split, span");
您对 JSeparator 也有同样的问题。
如果您应用此拆分原则,然后跨越第一个单元格,您所拥有的内容将按预期工作。
可运行示例
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import net.miginfocom.swing.MigLayout;
public class Test {
public static void main(String[] args)
{
JFrame frame = new JFrame("Snack Selection");
JTextField d_msrField = new JTextField("Jane Doe");
d_msrField.setEnabled(false);
d_msrField.setColumns(30);
JPanel panel = new JPanel(new MigLayout("wrap 2", "[]15[grow]"));
panel.add(new JLabel("Name:"), "gapbottom 11, gaptop 11, split, span");
panel.add(d_msrField, "wrap");
panel.add(new JRadioButton("Choose a Fruit"), "wrap, span");
panel.add(new JCheckBox("Apple"), "gapleft 18");
panel.add(new JCheckBox("Orange"));
panel.add(new JCheckBox("Pear"), "gapleft 18");
panel.add(new JCheckBox("Banana"));
panel.add(new JRadioButton("Choose a Vegetable"), "span, wrap");
panel.add(new JCheckBox("Celery"), "gapleft 18");
panel.add(new JCheckBox("Carrot"));
panel.add(new JRadioButton("Choose a Dairy Item"), "span, wrap");
panel.add(new JCheckBox("Milk"), "gapleft 18");
panel.add(new JCheckBox("Cheese"));
panel.add(new JLabel("Options"), "split, span");
panel.add(new JSeparator(), "gaptop 4, growx, wrap");
JTextArea ta = new JTextArea(5, 30);
JScrollPane opts = new JScrollPane(ta);
panel.add(opts, "gapleft 18, span, growx");
frame.add(panel);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
子行可能是也可能不是正确的术语,但这是我为了帮助回答问题而编造的描述性术语
我已阅读 Miglayout 快速入门指南和白皮书。我试图对对话框进行布局,以便所有复选框在两列中对齐,即使它们有时由单选按钮分隔。
我希望文本字段和分隔符跨越对话框的宽度,同时仍紧挨着它们的标签。文本区域也应该独占一行。我尝试拆分第一列并实现适当的间距,但是,组件不会 "span" 到下一列,即使使用关键字也是如此。
我认为这应该是可行的,因为快速入门指南说,
"It is of course possible to both span and split cells at the same time."
(第 2 页)
完整的代码示例如下。
public static void main(String[] args)
{
JFrame frame = new JFrame("Snack Selection");
JTextField d_msrField = new JTextField("Jane Doe");
d_msrField.setEnabled(false);
d_msrField.setColumns(30);
JPanel panel = new JPanel(new MigLayout("debug, wrap 2", "[]15[]"));
panel.add(new JLabel("Name:"), "gapbottom 11, gaptop 11, split 2");
panel.add(d_msrField, "span 2");
panel.add(new JRadioButton("Choose a Fruit"), "wrap");
panel.add(new JCheckBox("Apple"), "gapleft 18");
panel.add(new JCheckBox("Orange"));
panel.add(new JCheckBox("Pear"), "gapleft 18");
panel.add(new JCheckBox("Banana"));
panel.add(new JRadioButton("Choose a Vegetable"), "wrap");
panel.add(new JCheckBox("Celery"), "gapleft 18");
panel.add(new JCheckBox("Carrot"));
panel.add(new JRadioButton("Choose a Dairy Item"), "wrap");
panel.add(new JCheckBox("Milk"), "gapleft 18");
panel.add(new JCheckBox("Cheese"));
panel.add(new JLabel("Options"), "split 2");
panel.add(new JSeparator(), "span 2, growx");
JTextArea ta = new JTextArea(5, 30);
JScrollPane opts = new JScrollPane(ta);
panel.add(opts, "gapleft 18");
frame.setLayout(new BorderLayout());
frame.add(panel, BorderLayout.CENTER);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
编辑:为了解决这个问题,我在开头和 "wrap 3" 添加了一个额外的列,但我仍然很好奇是否有人知道为什么原始代码不起作用。
很高兴您使用 wrap 3
对其进行排序,但我认为您的主要问题是您如何使用 split, span
。
例如,如果您查看向面板添加内容的第一行
panel.add(new JLabel("Name:"), "gapbottom 11, gaptop 11, split 2");
panel.add(d_msrField, "span 2");
在这里你 split
第一个单元格(这实质上使该单元格成为网格中的子行),然后在你添加 d_msrField
时尝试 span
。 d_msrField
的问题已经是此 sub row
中的最后一个单元格,因此 span 不会执行任何操作。
您实际需要做的是跨越 sub row
.
panel.add(new JLabel("Name:"), "gapbottom 11, gaptop 11, split, span");
您对 JSeparator 也有同样的问题。
如果您应用此拆分原则,然后跨越第一个单元格,您所拥有的内容将按预期工作。
可运行示例
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import net.miginfocom.swing.MigLayout;
public class Test {
public static void main(String[] args)
{
JFrame frame = new JFrame("Snack Selection");
JTextField d_msrField = new JTextField("Jane Doe");
d_msrField.setEnabled(false);
d_msrField.setColumns(30);
JPanel panel = new JPanel(new MigLayout("wrap 2", "[]15[grow]"));
panel.add(new JLabel("Name:"), "gapbottom 11, gaptop 11, split, span");
panel.add(d_msrField, "wrap");
panel.add(new JRadioButton("Choose a Fruit"), "wrap, span");
panel.add(new JCheckBox("Apple"), "gapleft 18");
panel.add(new JCheckBox("Orange"));
panel.add(new JCheckBox("Pear"), "gapleft 18");
panel.add(new JCheckBox("Banana"));
panel.add(new JRadioButton("Choose a Vegetable"), "span, wrap");
panel.add(new JCheckBox("Celery"), "gapleft 18");
panel.add(new JCheckBox("Carrot"));
panel.add(new JRadioButton("Choose a Dairy Item"), "span, wrap");
panel.add(new JCheckBox("Milk"), "gapleft 18");
panel.add(new JCheckBox("Cheese"));
panel.add(new JLabel("Options"), "split, span");
panel.add(new JSeparator(), "gaptop 4, growx, wrap");
JTextArea ta = new JTextArea(5, 30);
JScrollPane opts = new JScrollPane(ta);
panel.add(opts, "gapleft 18, span, growx");
frame.add(panel);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
子行可能是也可能不是正确的术语,但这是我为了帮助回答问题而编造的描述性术语