我对MigLayout有一些奇怪的行为。我有一个反映我的问题的SSCCE。基本上,前两个面板之间存在间隙(间隙属于左侧单元)。其他一切都是我想要的。只有在JFrame
调整大且足够大时才会出现间隙。
左侧面板(名为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);
}
}
答案 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
,当您调整框架大小时,measurement
和config
面板所在的单元格也会调整大小,但{ {1}}面板将根据measurement
属性保持固定状态。我的推荐是强制w 500!
和measurement
小组及其细胞的生长。
像这样:
config
这就是你会得到的:
祝你好运!