MigLayout:奇怪的差距行为

时间:2013-05-30 16:32:29

标签: java swing miglayout

我对MigLayout有一些奇怪的行为。我有一个反映我的问题的SSCCE。基本上,前两个面板之间存在间隙(间隙属于左侧单元)。其他一切都是我想要的。只有在JFrame调整大且足够大时才会出现间隙。

SSCCE

左侧面板(名为Measurement)应具有固定宽度,而中间面板(名为Config)为pushx, growx,因此应填充其他面板留下的所有空间该行上的两个组件。但是左侧的小组细胞似乎偷了剩下的空间。

如何删除该空间(以便配置面板直接接触测量面板,测量面板的宽度恰好为500像素)?

我正在使用MigLayout 4.0。

import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.TitledBorder;

import net.miginfocom.swing.MigLayout;

public class Main {
    private static JButton minimizeButton;
    private static JPanel configPanel, plotPanel, measPanel;

    public static void main(final String[] args) {
        final JFrame frame = new JFrame("test");

        frame.setLayout(new MigLayout("insets 10, hidemode 3, debug", "", ""));

        frame.add(getMeasPanel(), "w 500!");
        frame.add(getConfigPanel(), "left, grow, pushx");
        frame.add(getMinimizeButton(), "right, top, wrap");
        frame.add(getPlotPanel(), "spanx 3, grow, push, wrap");

        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

    private static JPanel getConfigPanel() {
        if (configPanel == null) {
            configPanel = new JPanel(new MigLayout("insets 10"));
            configPanel.add(new JLabel("test123"), "spanx 2, wrap");
            configPanel.add(new JLabel("test123"), "h 40!");
            configPanel.add(new JLabel("test123"), "right, wrap");
            configPanel.setBorder(BorderFactory.createTitledBorder(null,
                    "Plot", TitledBorder.LEFT, TitledBorder.TOP, new Font(
                            "null", Font.BOLD, 12), Color.BLUE));
        }
        return configPanel;
    }

    private static JButton getMinimizeButton() {
        if (minimizeButton == null) {
            minimizeButton = new JButton("_");
            minimizeButton.setFocusPainted(false);
            minimizeButton.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent arg0) {
                    toggleConfigMinimize();
                }
            });
        }
        return minimizeButton;
    }

    private static JPanel getPlotPanel() {
        if (plotPanel == null) {
            plotPanel = new JPanel();
            plotPanel.setBorder(BorderFactory.createTitledBorder(null,
                    "Plot Config", TitledBorder.LEFT, TitledBorder.TOP,
                    new Font("null", Font.BOLD, 12), Color.BLUE));
        }
        return plotPanel;
    }

    private static JPanel getMeasPanel() {
        if (measPanel == null) {
            measPanel = new JPanel(new MigLayout("insets 10"));
            measPanel.add(new JLabel("test123"), "spanx 2, wrap");
            measPanel.add(new JLabel("test123"), "h 40!");
            measPanel.add(new JLabel("test123"), "right, wrap");
            measPanel.add(new JLabel("test123"), "spanx 2, wrap");
            measPanel.add(new JLabel("test123"), "spanx 2, wrap");
            measPanel.setBorder(BorderFactory.createTitledBorder(null,
                    "Measurement", TitledBorder.LEFT, TitledBorder.TOP,
                    new Font("null", Font.BOLD, 12), Color.BLUE));
        }
        return measPanel;
    }

    private static boolean showConfig = true;

    protected static void toggleConfigMinimize() {
        showConfig = !showConfig;
        getMeasPanel().setVisible(showConfig);
        getConfigPanel().setVisible(showConfig);
    }
}

2 个答案:

答案 0 :(得分:2)

解决方案是在列约束中定义config-column的增长行为:

frame.setLayout(new MigLayout("insets 10, hidemode 3, debug",
        "[][fill, grow][]", ""));
frame.add(getMeasPanel(), "w 500!");
frame.add(getConfigPanel(), "left, grow");
frame.add(getMinimizeButton(), "right, top, wrap");
frame.add(getPlotPanel(), "spanx 3, grow, wrap, push");

有一些怪癖(读:行为我个人并不完全理解:-)有推细胞约束,所以我倾向于尽可能避开它们。另外,我的偏好是在布局约束中定义wrap 3

<强>更新

只记得其中一个怪癖:跨越情节行中的推(实际上是隐含的pushx)是真正的罪魁祸首 - 它的多余空间进入第一列。考虑到这一点,这种行为并不是不合理的,在所有细胞约束都是关于......细胞之后,它们并不太关心其他细胞。

所以另一个解决办法就是让图表仅在y中显示(x推送已经由上面第二列中的配置单元处理)

frame.setLayout(new MigLayout("insets 10, hidemode 3, debug",
        // cell constraints are empty in original
        "",
        ""));

// meas should have a fixed size
frame.add(getMeasPanel(), "w 500!");
// the config should get all excess space when growing
frame.add(getConfigPanel(), "left, grow, pushx");
frame.add(getMinimizeButton(), "right, top, wrap");
// remove implicit the pushx
frame.add(getPlotPanel(), "spanx 3, grow, wrap, pushy");

我的偏好是第一个:在尽可能多的层次结构(约束)中尽可能多地进行配置,使得ui代码比将它们分散在单元格上更加可维护。

答案 1 :(得分:1)

问题在于measurement panel的固定大小。您在属性为plot panel的新行中添加span, push, grow,当您调整框架大小时,measurementconfig面板所在的单元格也会调整大小,但{ {1}}面板将根据measurement属性保持固定状态。我的推荐是强制w 500!measurement小组及其细胞的生长。

像这样:

config

这就是你会得到的: enter image description here

祝你好运!