Java MigLayout:奇怪的间隙行为

Java MigLayout:奇怪的间隙行为,java,swing,miglayout,Java,Swing,Miglayout,我和米格有一些奇怪的行为。我的SSCCE反映了我的问题。基本上,顶部两个面板之间有一个间隙(该间隙属于左侧单元格)。其他一切都是我想要的。只有当JFrame的大小足够大时,才会出现间隙 左侧面板(名为Measurement)应具有固定宽度,而中间面板(名为Config)为pushx,growx,因此应填充该行上其他两个组件留下的所有空间。但左面板单元似乎偷走了剩余的空间 如何删除该空间(以便配置面板直接接触测量面板,并且测量面板的宽度正好为500 px)? 我使用的是MigLayout 4.0

我和米格有一些奇怪的行为。我的SSCCE反映了我的问题。基本上,顶部两个面板之间有一个间隙(该间隙属于左侧单元格)。其他一切都是我想要的。只有当
JFrame
的大小足够大时,才会出现间隙

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

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

我使用的是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);
    }
}

问题在于
测量面板的固定大小。您在新行中添加属性为
span、push、grow
plot panel
,当您调整帧大小时,
measurement
config
panel所在的两个单元格也将调整大小,但您的
measurement
面板的大小将根据
w 500保持不变属性。我的建议是强制
测量
配置
面板及其单元格的增长

像这样:

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

import net.miginfocom.swing.MigLayout;

public class MigTest {
    JFrame frame = new JFrame();
    JPanel msmPanel = new JPanel();
    JPanel configPanel = new JPanel();
    JPanel plotPanel = new JPanel();
    JLabel lbl1 = new JLabel("Test 123");
    JLabel lbl2 = new JLabel("Test 123");

    public MigTest() {
        frame.setLayout(new MigLayout());
        msmPanel.add(lbl1);
        configPanel.add(lbl2);
        msmPanel.setBorder(BorderFactory.createTitledBorder("Measurement"));
        configPanel
                .setBorder(BorderFactory.createTitledBorder("Configuration"));
        plotPanel.setBorder(BorderFactory.createTitledBorder("Plot"));
        frame.add(msmPanel, "pushx,grow");
        frame.add(configPanel, "pushx, grow, wrap");
        frame.add(plotPanel, "span, push, grow");

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

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new MigTest();
            }
        });
    }

}
这就是你将得到的:


祝你好运

问题在于
测量面板的固定大小。您在新行中添加属性为
span、push、grow
plot panel
,当您调整帧大小时,
measurement
config
panel所在的两个单元格也将调整大小,但您的
measurement
面板的大小将根据
w 500保持不变属性。我的建议是强制
测量
配置
面板及其单元格的增长

像这样:

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

import net.miginfocom.swing.MigLayout;

public class MigTest {
    JFrame frame = new JFrame();
    JPanel msmPanel = new JPanel();
    JPanel configPanel = new JPanel();
    JPanel plotPanel = new JPanel();
    JLabel lbl1 = new JLabel("Test 123");
    JLabel lbl2 = new JLabel("Test 123");

    public MigTest() {
        frame.setLayout(new MigLayout());
        msmPanel.add(lbl1);
        configPanel.add(lbl2);
        msmPanel.setBorder(BorderFactory.createTitledBorder("Measurement"));
        configPanel
                .setBorder(BorderFactory.createTitledBorder("Configuration"));
        plotPanel.setBorder(BorderFactory.createTitledBorder("Plot"));
        frame.add(msmPanel, "pushx,grow");
        frame.add(configPanel, "pushx, grow, wrap");
        frame.add(plotPanel, "span, push, grow");

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

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new MigTest();
            }
        });
    }

}
这就是你将得到的:


祝你好运

解决方案是在列约束中定义配置列的增长行为:

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

更新

刚刚想起其中一个怪癖:生成图行中的push(实际上是隐含的pushx)才是真正的罪魁祸首——它多余的空间进入了它的第一列。想一想,这种行为并不是那么不合理,毕竟细胞接触是关于。。。细胞,他们不太关心其他细胞

因此,另一种解决方案是只在y方向上进行绘图推送(x方向的推送已经由其上方第二列中的config单元格处理)


我的首选是第一种:在层次结构(约束)中尽可能多地进行配置,使ui代码比分散在单元格中更易于维护。

解决方案是在列约束中定义配置列的增长行为:

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

更新

刚刚想起其中一个怪癖:生成图行中的push(实际上是隐含的pushx)才是真正的罪魁祸首——它多余的空间进入了它的第一列。想一想,这种行为并不是那么不合理,毕竟细胞接触是关于。。。细胞,他们不太关心其他细胞

因此,另一种解决方案是只在y方向上进行绘图推送(x方向的推送已经由其上方第二列中的config单元格处理)


我的首选是:在层次结构(约束)中尽可能多地进行配置,使ui代码比分散在单元格中更易于维护。

谢谢您的建议。不幸的是,这不是我想要的。我需要测量面板保持固定的宽度。难道不能将单元格设置为固定宽度吗?我试过使用
shrinkx
,但也没用。谢谢你的建议。不幸的是,这不是我想要的。我需要测量面板保持固定的宽度。难道不能将单元格设置为固定宽度吗?我试过使用shrinkx,但也没用。太棒了!谢谢你的回答,这正是我想要的。太棒了!谢谢你的回答,这正是我想要的。