[Miglayout]调整容器的大小以适应包含的所有组件的总大小,带有插入和间隙
[Miglayout]adjust the size of the container to fit the total size of all components contained, with insets and gap
如何使用 MigLayout 以便在 pack()
之后我可以看到 JFrame
具有适当的大小来容纳其所有子组件,具有边框、插入和间隙?现在我看到一些元素被切断,留下一半大小可见但一半被切断。
我刚刚想出了如何根据所有包含组件的大小总和来保证 Container 的正确大小,而无需对任何内容进行硬编码。
创建一个 JPanel panel
作为您的工作面板,而不是触摸 contentPane
。只需将其添加回 contentPane
。 不要碰contentPane
,这是关键。
设置 panel
的布局而不硬编码行高、列宽等。这可能会破坏布局,因为您的硬编码高度可能会小于或大于它,留下一些尺寸错误的线条,并留下最后的 line/column 一半被切断。
将您的元素添加到 panel
。添加它们时,您可以指定尺寸。
将panel
添加回contentPane
:getContentPane().add(panel);
我们不需要设置contentPane
的布局。
终于,pack()
,setVisible(true)
如你所愿。无需 setSize()
、setBounds()
等。MigLayout 会自动处理插入和间隙。 Viola!
一个 SSCCE:
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import net.miginfocom.swing.MigLayout;
public class InsetsAndBorder extends JFrame {
public InsetsAndBorder() {
begin();
}
private void begin() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
panel.setLayout(new MigLayout("insets 2 2 2 2, fillx, debug", "3[]3[]3[]3", "5[]5[]5[]5"));
JLabel label1 = new JLabel("1");
JLabel label2 = new JLabel("2");
JButton button = new JButton("No way!");
panel.add(label1, "cell 1 2, grow");
panel.add(label2, "cell 2 2, grow");
panel.add(button, "cell 0 1, grow");
getContentPane().add(panel);
pack();
setLocationRelativeTo(null);
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
InsetsAndBorder frame = new InsetsAndBorder();
}
});
}
}
如何使用 MigLayout 以便在 pack()
之后我可以看到 JFrame
具有适当的大小来容纳其所有子组件,具有边框、插入和间隙?现在我看到一些元素被切断,留下一半大小可见但一半被切断。
我刚刚想出了如何根据所有包含组件的大小总和来保证 Container 的正确大小,而无需对任何内容进行硬编码。
创建一个
JPanel panel
作为您的工作面板,而不是触摸contentPane
。只需将其添加回contentPane
。 不要碰contentPane
,这是关键。设置
panel
的布局而不硬编码行高、列宽等。这可能会破坏布局,因为您的硬编码高度可能会小于或大于它,留下一些尺寸错误的线条,并留下最后的 line/column 一半被切断。将您的元素添加到
panel
。添加它们时,您可以指定尺寸。将
panel
添加回contentPane
:getContentPane().add(panel);
我们不需要设置contentPane
的布局。终于,
pack()
,setVisible(true)
如你所愿。无需setSize()
、setBounds()
等。MigLayout 会自动处理插入和间隙。 Viola!
一个 SSCCE:
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import net.miginfocom.swing.MigLayout;
public class InsetsAndBorder extends JFrame {
public InsetsAndBorder() {
begin();
}
private void begin() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
panel.setLayout(new MigLayout("insets 2 2 2 2, fillx, debug", "3[]3[]3[]3", "5[]5[]5[]5"));
JLabel label1 = new JLabel("1");
JLabel label2 = new JLabel("2");
JButton button = new JButton("No way!");
panel.add(label1, "cell 1 2, grow");
panel.add(label2, "cell 2 2, grow");
panel.add(button, "cell 0 1, grow");
getContentPane().add(panel);
pack();
setLocationRelativeTo(null);
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
InsetsAndBorder frame = new InsetsAndBorder();
}
});
}
}