JButton 更改默认边框

Kit*_*chi 3 java swing border look-and-feel jbutton

我正在使用 SystemLookAndFeel,它在我的按钮周围设置默认边框。

现在我想要一个股票黑色边框,但是当我设置边框时,它只会在默认边框周围添加我的新边框,所以我有两个。

如何在不删除 LookAndFeel 的情况下更改或删除边框?

另外:我正在使用 java 7 和 Win 8.1

Mad*_*mer 7

在 Windows 10 上使用 Java 8,我做了这个小测试

很多按钮

如您所见,我可以开始工作的唯一方法是使用 setContentAreaFilled

普遍的问题是,许多外观不使用该border属性,而是独立绘制自己的边框(因此是 的原因setBorderPainted),但 Windows 10 的外观只是希望有所不同

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.LineBorder;

public class ButtonTest {

    public static void main(String[] args) {
        new ButtonTest();
    }

    public ButtonTest() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridwidth = GridBagConstraints.REMAINDER;
            gbc.fill = GridBagConstraints.HORIZONTAL;

            JButton btn = new JButton("Normal");
            add(btn, gbc);

            btn = new JButton("With border");
            btn.setBorder(new LineBorder(Color.BLACK));
            add(btn, gbc);

            btn = new JButton("borderPainted false");
            btn.setBorderPainted(false);
            btn.setBorder(new LineBorder(Color.BLACK));
            add(btn, gbc);

            btn = new JButton("contentArea false");
            btn.setContentAreaFilled(false);
            btn.setBorder(new LineBorder(Color.BLACK));
            add(btn, gbc);

            btn = new JButton("focusPained false");
            btn.setContentAreaFilled(false);
            btn.setFocusPainted(false);
            btn.setBorder(new LineBorder(Color.BLACK));
            add(btn, gbc);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

    }

}
Run Code Online (Sandbox Code Playgroud)

  • 带有 setContentArea(false) 的那部分可以正常工作,谢谢!我正在使用 Java 7 和 WINdows 8.1,但它仍然有效。问题是我没有使用 setContentAreaFalse 对:我将它设置为 false 然后 setBorder 然后将它设置为 true 这有点愚蠢......接受你的回答,再次感谢;) (2认同)