Java 如何控制具有MigLayout的配电盘的总体尺寸约束?

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

我正在为一个项目测试MigLayout,但我似乎无法找到MigLayout控制整个面板大小的方法。我正在改编本书中的例子。另外,我用Python和Jython编写,而不是用Java编写。也就是说,这是我当前的代码

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% 许多独立应用程序是用

  • 具有固定大小(不可调整大小)和完全调整内容的对话框窗口

  • 可调整大小但具有最小大小的主窗口(例如800x600)

  • 您想要的(没有硬编码值的可调整大小的窗口)是可能的,但很难实现(这是其他10%的应用程序)

    由于JavaSwing在布局方面有着臭名昭著的困难(这是存在如此多布局管理器的主要原因),我建议您遵循简单的方法

    您可以使用各种组件的setPreferedSize和setMinimum size方法,但
    很难做到完美。

    就我个人而言,我不会过分强调最小尺寸,只要是首选尺寸(打包后的尺寸)()是合适的。如果出于某种原因,用户希望将窗口缩小到可以剪裁其中组件的大小,那么就让他们来吧。也许他们只是想把窗口的底部挖出来,这样他们就可以同时在显示器上看到剩下的东西和其他东西

    我认为任何窗口的真正最小大小都是其边框和标题栏的总和,以及标题文本中几个字符和省略号的空间。如果用户想要小于允许所有组件显示未剪辑的内容,那么您将强制谁执行其他操作

    使用web上提供的几种基于表格的布局管理器中的任何一种,如MIG布局,您应该能够轻松获得所需的大小调整行为


    无耻的自我插入:如果你发现MIG布局很难使用,我认为我的更容易使用。但MIG布局更强大。我故意选择对MatrixLayout进行编码,以避免面板缩小到计算出的最小尺寸以下。

    我刚刚想出了如何根据包含的所有com的大小总和刷新框架大小没有硬编码的组件

  • 创建一个
    JPanel面板作为您的工作面板,而不是触摸
    contentPane
    。只需将其添加回
    contentPane
    不要触摸
    contentPane
    ,它是关键。

  • 设置
    面板的布局
    时不使用硬编码的行高、列宽等。这可能会破坏布局,因为硬编码的高度可能小于或大于所需的高度,留下一些大小不正确的行,并将最后一行/列的一半截断

  • 将元素添加到
    面板中
    。添加元素时,可以指定大小

  • panel
    添加回
    contentPane
    getContentPane()。添加(panel);
    我们不需要设置
    contentPane
    的布局

  • 最后,
    pack()
    setVisible(true)
    如您所愿。无需
    setSize()
    setBounds()
    等。插入和间隙将由MigLayout自动处理。Viola

  • SCCEE:

    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();
    
                }
    
            });
        }
    }
    

    这设置了大小,但并不能阻止用户调整大小。@SM:离题:你去哪里了软件猴子?我有一段时间没见到你了。很高兴再次见到你。再见!@Oscar:我去了,一周检查几次,在我认为能帮上忙的地方到处扔东西回答问题。但主要是,我把我的n产品截止日期的长时间——通常是:X工作量和X/10时间。