【问题标题】:Change Border Color of a JButton in Java Swing preserving the insets在 Java Swing 中更改 JButton 的边框颜色保留插图
【发布时间】:2019-10-03 02:08:24
【问题描述】:

我想在 Java Swing 中更改 JButton 组件的边框颜色。

我尝试了以下方法:

package com.example.test;

import java.awt.Color;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test extends JFrame {

    public Test() {

        JPanel panel = new JPanel();
        JButton button1 = new JButton("Test Button 1");
        JButton button2 = new JButton("Test Button 2");
        button2.setBorder(BorderFactory.createLineBorder(Color.RED));

        panel.add(button1);
        panel.add(button2);

        this.add(panel);


        setSize(400, 400);
        setVisible(true);

    }

    public static void main(String[] args) {

        try {
            UIManager.setLookAndFeel( UIManager.getCrossPlatformLookAndFeelClassName() );
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
        } catch (UnsupportedLookAndFeelException ex) {
            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
        }
        Test t = new Test();
    }
}

这会生成两个按钮,在 button2 组件上我尝试更改边框颜色,但它删除了填充。有没有办法保留标准 JButton 的原始插图并只更改颜色?

注意:我假设在分配新边框时插入已被删除。但我不是 100% 确定的。

【问题讨论】:

    标签: java swing border jbutton


    【解决方案1】:

    不要创建LineBorder,而是使用CompoundBorder

    button2.setBorder(BorderFactory.createCompoundBorder(
                BorderFactory.createLineBorder(Color.RED, 1), 
                BorderFactory.createEmptyBorder(
                    button1.getBorder().getBorderInsets(button1).top, 
                    button1.getBorder().getBorderInsets(button1).left, 
                    button1.getBorder().getBorderInsets(button1).bottom, 
                    button1.getBorder().getBorderInsets(button1).right)));
    

    我把BorderInsets 换成了button1,这样它们的大小就一样了。

    我的回答基于@MadProgrammer 对this question 的回答


    顺便说一句,不要扩展JFrame,而是创建它的一个实例,如果你真的需要扩展一个组件,那就是JPanelExtends JFrame vs. creating it inside the program

    别忘了打电话

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    

    在您的 JFrame 实例上,以便您的程序在您关闭时终止。

    您还错过了将您的程序放在 EDT 上,请在 this answer 上查看更多信息

    【讨论】:

    • 感谢您的回答和旁边的 cmets/建议。它有帮助。
    猜你喜欢
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    • 2015-09-03
    相关资源
    最近更新 更多