Java 如何控制具有MigLayout的配电盘的总体尺寸约束?
我正在为一个项目测试MigLayout,但我似乎无法找到MigLayout控制整个面板大小的方法。我正在改编本书中的例子。另外,我用Python和Jython编写,而不是用Java编写。也就是说,这是我当前的代码Java 如何控制具有MigLayout的配电盘的总体尺寸约束?,java,user-interface,miglayout,Java,User Interface,Miglayout,我正在为一个项目测试MigLayout,但我似乎无法找到MigLayout控制整个面板大小的方法。我正在改编本书中的例子。另外,我用Python和Jython编写,而不是用Java编写。也就是说,这是我当前的代码 layout = MigLayout("fillx", # Column constraints "[right]rel[grow,fill]", # Row constr
layout = MigLayout("fillx",
# Column constraints
"[right]rel[grow,fill]",
# Row constraints
"[]10[]10[]")
panel = JPanel(layout)
panel.add(JLabel("Enter size:"),
"")
panel.add(JTextField(""),
"wrap, width 150:250")
panel.add(JLabel("Enter weight:"),
"")
panel.add(JTextField(""),
"wrap, width 150:250")
panel.add(JButton("Ok"),
"span 2, align center, width 100:150")
然后,面板进入JFrame中进行显示。当我调整框架的大小时,控件可以很好地调整大小并遵循它们的最小大小。但是,框架上没有最小尺寸,似乎也没有任何方法可以达到面板的实际最小尺寸,以便为框架设置面板。询问面板的最小大小将返回一个大小,当在框架上设置该大小时(加上插图),该大小将切断按钮和一半的文本字段
我想要的是能够设置框架的最小尺寸(不是硬编码!),这样面板就合适了,并且没有任何控件被切断。最好的方法是什么?方法如何
更新:
现在我明白你想做什么了。很抱歉让你失望,但是90%
许多独立应用程序是用
很难做到完美。就我个人而言,我不会过分强调最小尺寸,只要是首选尺寸(打包后的尺寸)()是合适的。如果出于某种原因,用户希望将窗口缩小到可以剪裁其中组件的大小,那么就让他们来吧。也许他们只是想把窗口的底部挖出来,这样他们就可以同时在显示器上看到剩下的东西和其他东西 我认为任何窗口的真正最小大小都是其边框和标题栏的总和,以及标题文本中几个字符和省略号的空间。如果用户想要小于允许所有组件显示未剪辑的内容,那么您将强制谁执行其他操作 使用web上提供的几种基于表格的布局管理器中的任何一种,如MIG布局,您应该能够轻松获得所需的大小调整行为
无耻的自我插入:如果你发现MIG布局很难使用,我认为我的更容易使用。但MIG布局更强大。我故意选择对MatrixLayout进行编码,以避免面板缩小到计算出的最小尺寸以下。我刚刚想出了如何根据包含的所有com的大小总和刷新框架大小没有硬编码的组件
JPanel面板作为您的工作面板,而不是触摸contentPane
。只需将其添加回contentPane
不要触摸contentPane
,它是关键。
面板的布局
时不使用硬编码的行高、列宽等。这可能会破坏布局,因为硬编码的高度可能小于或大于所需的高度,留下一些大小不正确的行,并将最后一行/列的一半截断面板中
。添加元素时,可以指定大小panel
添加回contentPane
:getContentPane()。添加(panel);
我们不需要设置contentPane
的布局pack()
,setVisible(true)
如您所愿。无需setSize()
,setBounds()
等。插入和间隙将由MigLayout自动处理。Violaimport 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();
}
});
}
}
这设置了大小,但并不能阻止用户调整大小。@SM:离题:你去哪里了软件猴子?我有一段时间没见到你了。很高兴再次见到你。再见!@Oscar:我去了,一周检查几次,在我认为能帮上忙的地方到处扔东西回答问题。但主要是,我把我的n产品截止日期的长时间——通常是:X工作量和X/10时间。