【问题标题】:How do I control the overall size constraints of a panel with MigLayout?如何使用 MigLayout 控制面板的整体尺寸限制?
【发布时间】:2010-11-17 17:07:12
【问题描述】:

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

我想要的是能够设置框架的最小尺寸(不是硬编码!),以便面板适合并且不会切断任何控件。最好的方法是什么?

【问题讨论】:

    标签: java user-interface miglayout


    【解决方案1】:

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

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

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

    无耻的自我插件:如果你觉得 MIG Layout 很难使用,我认为我的MatrixLayout 更容易使用。但MIG布局更强大。我故意选择对 MatrixLayout 进行编码,以不阻止面板减小到低于其计算的最小尺寸。

    【讨论】:

    • @SM:题外话:你去哪儿了 Software Monkey?我有一段时间没见你了。很高兴再次见到你。再见!
    • @Oscar:我一直在附近,每周检查几次,抛出并在这里和那里回答我认为我可以提供帮助的地方。但大多数情况下,我会在产品最后期限上花费很长时间——通常情况下:X 工作量和 X/10 时间来完成它。
    【解决方案2】:

    pack 方法怎么样???

    更新:

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

    编写的
    1. 具有固定大小(不可调整大小)和完美调整内容的对话框窗口

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

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

    由于 Java Swing 在布局方面出了名的困难(这是有这么多布局管理器存在的主要原因),我建议你按照简单的方法。

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

    【讨论】:

    • 设置大小,但它不会阻止用户调整大小。
    【解决方案3】:

    我只是想出了如何根据所有包含的组件的大小之和来刷新帧大小,而不用硬编码任何东西。

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

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

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

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

    5. 最后,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();
    
                }
    
            });
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-11-07
      • 1970-01-01
      • 1970-01-01
      • 2021-04-24
      • 1970-01-01
      • 2017-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多