如何使用MigLayout控制面板的整体大小限制?

时间:2009-08-07 14:13:32

标签: java user-interface miglayout

我正在测试一个项目的MigLayout,我似乎无法弄清楚MigLayout控制正在布局的整个面板大小的方法。我正在调整MigLayout whitepaper中的示例。另外,我用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进行显示。当我调整框架的大小时,控件会很好地调整大小并遵循它们的最小尺寸。但是,框架上没有最小尺寸,似乎也没有任何方法可以达到面板的实际最小尺寸来为框架设置它。询问面板的最小尺寸会返回一个尺寸,当在框架上设置(加上插图)时,会切断按钮和一半的文本字段。

我想要的是能够设置框架的最小尺寸(不是硬编码!),以便面板适合并且没有任何控件被切断。这样做的最佳方式是什么?

3 个答案:

答案 0 :(得分:2)

pack方法???

怎么样?

<强>更新

现在我明白你要做什么了。很抱歉让你失望,但90% 独立应用程序的编写用

  1. 具有固定大小(不可调整大小)且完全调整为内容的对话窗口

  2. 可调整大小但尺寸最小的主窗口(例如800x600)

  3. 你想要什么(一个没有硬编码值的可调整大小的窗口)是可能的,但很难实现(这是其他10%的应用程序)

    由于Java Swing在布局上遇到了巨大的困难(这是布局管理者存在的主要原因),我建议你按照简单的方法进行操作。

    您可以使用各种组件的setPrefferedSize和setMinimum size方法 很难让它变得完美。

答案 1 :(得分:2)

就个人而言,我不会过分强调最小尺寸,只要首选尺寸(你在pack()之后获得的是适当的。如果由于某种原因,用户想要将窗口减小到一个尺寸,其中的组件被剪裁,然后让它们。也许他们只是想让你的窗户底部出来,这样他们就可以同时看到他们的显示器上剩下的东西和其他东西。

我认为任何窗口的真实最小尺寸是它的边框和标题栏的总和,以及标题文本的几个字符和省略号的空间。如果用户想要的东西小于允许所有组件显示未剪辑的内容,那么您是否要执行?

使用网络上可用的几种基于表格的布局管理器(如MIG Layout),您应该能够轻松获得所需的调整大小行为。

无耻的自我插件:如果您发现MIG Layout难以使用,我认为我的MatrixLayout更容易使用。但MIG布局更强大。我故意选择对MatrixLayout进行编码,以防止面板降低到低于计算出的最小尺寸。

答案 2 :(得分:0)

我只想弄清楚如何根据所有包含组件的大小总和来刷新帧大小,而不需要对任何硬编码进行硬编码。

  1. 创建JPanel panel作为工作面板,而不是触及contentPane。只需将其添加回contentPane即可。 请勿触摸contentPane,这是关键。

  2. 设置panel的布局,没有硬编码的行高,列宽等。这可能会破坏布局,因为您的硬编码高度可能会更少或更多需要,留下一些错误的行大小,并将你的最后一行/一半留下。

  3. 将您的元素添加到panel。添加它们时,您可以指定尺寸。

  4. panel添加回contentPanegetContentPane().add(panel);我们不需要设置contentPane的布局。

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

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