Java JButton更改默认边框

Java JButton更改默认边框,java,swing,border,jbutton,look-and-feel,Java,Swing,Border,Jbutton,Look And Feel,我正在使用SystemLookAndFeel,它在我的按钮周围创建默认边框 现在我想要一个黑色边框,但是当我设置边框时,它只会在默认边框周围添加我的新边框,所以我有两个 如何在不删除外观的情况下更改或删除边框 另外:我正在使用java 7和Win 8.1试试这个程序,它有Jbutton中所有类型的边框 import javax.swing.*; import java.awt.*; public class jbuttonBoders extends JFrame {

我正在使用SystemLookAndFeel,它在我的按钮周围创建默认边框

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

如何在不删除外观的情况下更改或删除边框


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

试试这个程序,它有Jbutton中所有类型的边框

    import javax.swing.*;
    import java.awt.*;

    public class jbuttonBoders extends JFrame {

        private JButton button[];

        private JPanel panel;

        public jbuttonBoders() {

            super("JButton Border");

            setSize(220,190);

            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            button = new JButton[12];

            panel = new JPanel();

            panel.setLayout(new FlowLayout(FlowLayout.CENTER));

            //Constructing all 12 JButtons using "for loop"

            for(int count=0; count<button.length; count++) {

                button[count] = new JButton("Button "+(count+1));

                panel.add(button[count]);

            }



            //Setting Different Borders on each JButton

            button[0].setBorder(BorderFactory.createLineBorder(Color.blue)); // Simple Line Border

            button[1].setBorder(BorderFactory.createLineBorder(Color.red, 5)); // Line Border + Thickness of the Border

            button[2].setBorder(BorderFactory.createBevelBorder(1)); // Inner Bevel Border

            button[3].setBorder(BorderFactory.createBevelBorder(0)); // Outer Bevel Border

            button[4].setBorder(BorderFactory.createBevelBorder(1, Color.red, Color.blue)); // Two Colors Inner Bevel

            button[5].setBorder(BorderFactory.createBevelBorder(0, Color.green, Color.orange)); // Two Colors Outer Bevel

            button[6].setBorder(BorderFactory.createBevelBorder(1, Color.green, Color.orange, Color.red, Color.blue)); //Four Colors Inner Bevel

            button[7].setBorder(BorderFactory.createBevelBorder(0, Color.green, Color.orange, Color.red, Color.blue)); //Four Colors Outer Bevel

            button[8].setBorder(BorderFactory.createEmptyBorder(5,10,5,50)); // Empty Border (Upper Space, Left Space, Bottom Space, Right Space)

            button[9].setBorder(BorderFactory.createEtchedBorder(0)); //Raised Border Line

            button[10].setBorder(BorderFactory.createEtchedBorder(1)); //

            button[11].setBorder(BorderFactory.createTitledBorder("My Titled Border")); // Titled Border



            /** The Borders shown above are the basic borders that we commonly used.

             *  There are still lots of Border Styles available so all you have to do is to discover

             *  and have some experiment using all the available borders. I recommend you use JCreator Pro

             *  if want to know more about different border styles and learn how to implement them.

             */



            //Setting up the container ready for the components to be added.

            Container pane = getContentPane();

            setContentPane(pane);



            //Adding the JPanel to the container

            pane.add(panel);



            /**Set all the Components Visible.

             * If it is set to "false", the components in the container will not be visible.

             */

            setVisible(true);

        }



        //Main Method

        public static void main (String[] args) {

            jbuttonBoders jbb = new jbuttonBoders();

        }

    }


    Important Part of the Program: 

    //Setting Different Borders on each JButton

            button[0].setBorder(BorderFactory.createLineBorder(Color.blue)); // Simple Line Border

            button[1].setBorder(BorderFactory.createLineBorder(Color.red, 5)); // Line Border + Thickness of the Border

            button[2].setBorder(BorderFactory.createBevelBorder(1)); // Inner Bevel Border

            button[3].setBorder(BorderFactory.createBevelBorder(0)); // Outer Bevel Border

            button[4].setBorder(BorderFactory.createBevelBorder(1, Color.red, Color.blue)); // Two Colors Inner Bevel

            button[5].setBorder(BorderFactory.createBevelBorder(0, Color.green, Color.orange)); // Two Colors Outer Bevel

            button[6].setBorder(BorderFactory.createBevelBorder(1, Color.green, Color.orange, Color.red, Color.blue)); //Four Colors Inner Bevel

            button[7].setBorder(BorderFactory.createBevelBorder(0, Color.green, Color.orange, Color.red, Color.blue)); //Four Colors Outer Bevel

            button[8].setBorder(BorderFactory.createEmptyBorder(5,10,5,50)); // Empty Border (Upper Space, Left Space, Bottom Space, Right Space)

            button[9].setBorder(BorderFactory.createEtchedBorder(0)); //Raised Border Line

            button[10].setBorder(BorderFactory.createEtchedBorder(1)); //

            button[11].setBorder(BorderFactory.createTitledBorder("My Titled Border")); // Titled Border
import javax.swing.*;
导入java.awt.*;
公共类jbuttonBoders扩展了JFrame{
私有JButton按钮[];
私人JPanel小组;
公共jbuttonBoders(){
超级(“杰布顿边界”);
设置大小(220190);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
按钮=新的JButton[12];
panel=新的JPanel();
panel.setLayout(新的FlowLayout(FlowLayout.CENTER));
//使用“for循环”构造所有12个JButton

对于(int count=0;count在Windows10上使用Java8,我做了这个小测试

正如您所看到的,我可以使用的唯一方法是使用
setContentAreaFilled

一般的问题是,许多外观不使用
border
属性,而是独立绘制自己的边框(这就是为什么要使用
setbOrderPaint
),但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);
        }

    }

}

您可能需要调整LAF。
JButton#setbordPaint
@Thomas然后uimanager.put()方法将完成此工作?@MadProgrammer这不就是删除所有边框吗?它将(或应该)删除“边框”按钮这是由外观绘制的,但通过
setboorder
应用的边框将继续绘制否,不幸的是,正如我在上面的评论中所述,它只是删除了我自己的边框,并保留了正常工作的默认Yes,但当您放入(系统)时LAF它还使用默认边框。setContentArea(false)的部分工作正常,谢谢!我正在使用Java 7和WIndows 8.1,但仍然有效。问题是我没有使用setContentAreaFalse对:我将其设置为false,然后设置为true,这有点愚蠢……接受了你的答案,再次感谢;)