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