Swing MigLayout - 无法避免不必要的差距

时间:2016-10-25 23:23:16

标签: java swing layout-manager miglayout

我正在使用MigLayout编写一些Swing应用程序用于测量目的。我正试图消除不必要的差距。

我已经注意到由于顶部的句子而存在差距。但是,当我删除它时,它看起来很好。

问题见下图:

enter image description here

我添加句子的方式是:

add(text, "wrap, center, gap top 20");

我添加按钮的方式:

String wrap = shouldWrap(i) ? "wrap" : "";
this.add(button, "gapbefore 15, width 50, height 20, " + wrap);

任何人都可以帮我解释为什么会发生这种情况以及我如何消除与句子存在的差距?

//////////// EDIT

我想使用当前的基础架构,我在MigLayout中启用了调试模式,我看到类似这样的内容:

My JPanel in debug mode looks like this

我想知道为什么一行中每个第一个组件的边框大小都设置为与“请,指定你对给定语句多少一致”句子的大小相匹配。

有没有办法使用MigLayout为每个组件禁用该选项?

2 个答案:

答案 0 :(得分:1)

您只需使用约束"拆分x",它会将行划分为挤在一起的X部分:

不分割:

public class SentenceExample {

    public static void main(String[] args) {
        JFrame frame = new JFrame("JFrame Example");
        JPanel panel = new JPanel();

        panel.setLayout(new MigLayout());

        panel.add(new JLabel("Please, specify how much you agree with the given statements"), "wrap");

        panel.add(new JButton("1"));
        panel.add(new JButton("2"));
        panel.add(new JButton("3"));
        panel.add(new JButton("4"));
        panel.add(new JButton("5"));
        panel.add(new JButton("6"));
        panel.add(new JButton("7"));
        panel.add(new JButton("8"));
        panel.add(new JButton("9"));
        panel.add(new JButton("10"));

        frame.add(panel);
        frame.setSize(900, 300);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

这看起来像这样:

WithoutSplit

分拆:

如果你改变了第一个JButton-line:

panel.add(new JButton("1"));

到此:

panel.add(new JButton("1"), "split 10");

您的GUI将如下所示:

WithSplit

带约束的第一个按钮"分割10"安排10"插槽",按钮本身和接下来的9个元素将被放入。

为每行中的第一个按钮(即带有循环)执行此操作,并获得所需的外观。

修改 如果对每个第一个按钮使用循环过于繁琐,则可以使用面板布局本身的列约束,使其具有7列,并使句子跨越多个列。有关如何创建列约束的信息,请参见此处http://www.miglayout.com/QuickStart.pdf

"分裂"可能更容易使用,但列约束可能会更清晰。

答案 1 :(得分:0)

为什么不简单地嵌套JPanel并使用复合布局?

例如,整个JPanel可以在顶部使用BorderLayout和JLabel标题(BorderLayout.PAGE_START possition),内部JPanel可以使用MigLayout,保持组件网格,并保存在外部JPanel&#39 ; s BorderLayout.CENTER职位。