如何摆脱Nimbus LAF按钮周围的空间?

时间:2016-01-27 15:20:10

标签: java swing nimbus

我需要将一些JButton放在一个非常小的地方,问题是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中注释掉的代码中所看到的,我尝试了很多东西,但它们没有删除按钮周围的空间。

编辑:根据评论中的讨论,似乎无法删除按钮的矩形边和绘制的圆角矩形轮廓之间的空格。 Nimbus为“焦点突出显示”保留了这两个像素,如果不重新实现大量的Nimbus功能,这可能无法改变。

所以我接受了guleryuz的诀窍:如果按钮位于重叠和负位置,他们可以看起来更大。在实践中,这个想法似乎有效,但它不是一个非常干净的解决方案,所以如果你知道更好(并且相当容易实现)的解决方案,请不要犹豫回答...

2 个答案:

答案 0 :(得分:0)

请注意,如果设置背景颜色然后调用setOpaque(true),则可以看到按钮正好相互对立。这就是Nimbus如何画一个按钮;我不认为你可以改变按钮的矩形边缘和绘制的圆角矩形轮廓之间的空间。

如果空间是溢价,您可以通过取消注释UIDefaults行并修改contentMargins属性来缩小尺寸(但不要使用0,0,0,0,使用像2,8,2这样的东西,8)。

答案 1 :(得分:0)

接近1:

JPanel p = new JPanel(new FlowLayout(FlowLayout.LEFT, -4, 0));

方法2:

    JPanel p = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0));
    p.add(createButton("aa", 1));
    p.add(createButton("bb", 2));
    p.add(createButton("cc", 3));

在createButton方法中进行了一些修改

private static JButton createButton(String text, final int s) {
    JButton b = new JButton(text){
        @Override
        public void setLocation(int x, int y) {
            super.setLocation(x-(s*4), y);
        }
    };
    return b;
}

接近3

JPanel p = new JPanel(new MigLayout("ins 0, gap -5","[][][]"));