【发布时间】:2016-01-27 15:20:09
【问题描述】:
我需要将一些 JButtons 放在一个很小的地方,问题是 Nimbus LAF 会自动在它们周围放置一些空间,结果按钮看起来比实际要小。
在下面的示例程序中,我使用了具有 0 个水平和垂直间隙的 FlowLayout,并且我希望按钮可以紧密地放置,它们之间没有任何空间。如果我注释掉 Nimbus LAF 的设置,它们会按预期运行。
import javax.swing.*;
import java.awt.FlowLayout;
public class NimbusSpace {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
buildGUI();
}
});
}
private static void buildGUI() {
try {
UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e) {
e.printStackTrace();
}
JFrame f = new JFrame("Test");
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
JPanel p = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0));
p.add(createButton("aa"));
p.add(createButton("bb"));
p.add(createButton("cc"));
f.add(p);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
private static JButton createButton(String text) {
JButton b = new JButton(text);
// b.setBorder(null);
// b.setBorderPainted(false);
// b.setMargin(new Insets(0,0,0,0));
// b.putClientProperty("JComponent.sizeVariant", "large");
// b.putClientProperty("JComponent.sizeVariant", "mini");
// UIDefaults def = new UIDefaults();
// def.put("Button.contentMargins", new Insets(0,0,0,0));
// b.putClientProperty("Nimbus.Overrides", def);
return b;
}
}
正如您在 createButton 中注释掉的代码中看到的那样,我尝试了很多东西,但它们并没有删除按钮周围的空间。
编辑:根据 cmets 中的讨论,似乎无法移除按钮矩形边缘与绘制的圆角矩形轮廓之间的空间。 Nimbus 为“焦点高光”保留这两个像素,如果不重新实现许多 Nimbus 功能,这可能无法更改。
所以我接受了 guleryuz 的技巧:如果按钮位于重叠和负位置,它们可以看起来更大。在实践中这个想法似乎可行,但它不是一个非常干净的解决方案,所以如果您知道更好(并且相当容易实现)的解决方案,请不要犹豫回答......
【问题讨论】:
-
你的意思是按钮应该像这样在一起? stackoverflow.com/questions/34782238/…
-
@hamena314 我的实际问题是我在一个小地方有一些小按钮,这个问题使它们看起来比实际更小。我的例子只是为了说明问题。您的示例看起来很有趣,但我想要常规的 Nimbus 按钮,只是看起来更大。
-
“间距”是为“焦点突出”留出空间
-
@MadProgrammer 你可能是对的,间距是两个像素,焦点高亮也是两个像素。如果我用 guleryuz 的 hack 将大小增加一个像素,剩下的一像素高光对我来说已经足够了,实际上焦点高光对于这个按钮根本不重要。
-
guleryuz 的“hack”有点危险,因为它不会同时修改组件的大小以进行补偿,并且可能会导致一堆意想不到且难以重复的问题