MigLayout JLabel超出了约束条件

时间:2014-01-08 19:39:05

标签: java swing layout-manager miglayout

我正在以下列方式使用MigLayout

    panel.setLayout(new MigLayout("",
            "[][600!][]",
            "[][][][][][][][][]"));
    panel.add(composerTitle);
    panel.add(composerText, "wmax 600");
    panel.add(lblCount, "push, align right, wrap");
    panel.add(costTitle);
    panel.add(costText, "wrap,wmax 600");
    panel.add(titleTitle);
    panel.add(titleText, "wrap,wmax 600");
    panel.add(publisherTitle);
    panel.add(publisherText, "wrap,wmax 600");
    panel.add(scoreinfoTitle);
    panel.add(scoreinfoText, "wrap,wmax 600");
    panel.add(languageTitle);
    panel.add(languageText, "wrap,wmax 600");
    panel.add(collectionTitle);
    panel.add(collectionText, "wrap,wmax 600");
    panel.add(numbersTitle);
    panel.add(numbers, "grow, span 2, wrap");//JTextArea that uses line wrap
    panel.add(contentTitle);
    panel.add(content, "grow, span 2, wrap");//JTextArea

有时我的标签可能会超过600!我为列添加了约束。因此,我预计标签永远不会超过600,因为max设置为600.但是,如果标签有足够的文本,它就是这样做的。因此,我不得不为每个“wmax 600”添加约束。没有这个限制,我的标签就在框架内运行了。

有没有办法做到这一点,所以我不必为我添加的每个标签添加“wmax 600”。这似乎打败了600的目的!列的约束。

1 个答案:

答案 0 :(得分:6)

MigLayout的基本特征:

  • cell-size!= component-size:行/列约束仅影响前者
  • 它总是尊重组件的min / pref / max,除非在ComponentConstraint中被覆盖

那些与minSize只比其prefSize略小的标签相结合的那些导致那些过冲(又名:>小于单元宽度)的组件尺寸。要至少将组件约束与列约束分离(即,当后者更改时不必更改所有前者),您可以使用wmin:

JPanel panel = new JPanel();
panel.setLayout(new MigLayout("wrap 3, debug",
        "[][300!][]"));
panel.add(new JLabel("first, normal: "));
panel.add(new JLabel("and here we want something reaaly long" 
        + "and here we want something reaaly long")
          , "wmin 0"
        );
panel.add(new JLabel("10"));
panel.add(new JLabel("second: "));
panel.add(new JLabel("another"));

或者(如果你的应用程序中有很多这样的布局),子类JLabel并覆盖getMinPreferredSize返回(0,minHeight)。稍微有些脏,但是对于JLabel来说可能没有多大意义:毕竟默认情况下,它已经可以通过显示省略号来处理它,您可以进一步增强子类以显示带有完整文本的工具提示。