如何创建忽略当前外观的自定义 JComponent(如 JButton)

How to create a custom JComponent (like a JButton) ignoring current Look and Feel

我有一个应用程序具有默认的外观 (insubstantial) 并且设置了许多默认值,例如:

    UIManager.put( "List.foreground", Color.BLACK );
    UIManager.put( xyz, zyzLEF );
//around 150 istructions like that

此应用程序非常庞大,并且有许多根据客户需求定制的覆盖,但是现在我需要创建自己的 JButton 并进行一些设置(ForegroundBackgroundFont 等等), 由于默认值 而无法按我的意愿行事(例如,setOpaque(true||false) 根本没有效果)。

所以我正在尝试创建自己的 JButton 忽略默认外观,例如:

public class MyButton extends JButton {
    public MyButton(String text, int lineHeight)
    {
        super(text);
        setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
        setBackground(Color.WHITE);
        //foo
        setOpaque(true);
    }

    @Override
    public String getUIClassID() {
        return "MyButton";
    }

启动时:

UIManager.put("MyButton","javax.swing.plaf.ButtonUI");

这导致了这个错误:

UIDefaults.getUI() failed: createUI() failed for com.foo.MyButton[,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.0,border=,flags=0,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=null,paintBorder=true,paintFocus=true,pressedIcon=,rolloverEnabled=false,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=Hello World,defaultCapable=true] java.lang.reflect.InvocationTargetException
java.lang.Error
    at javax.swing.UIDefaults.getUIError(UIDefaults.java:732)
    at javax.swing.MultiUIDefaults.getUIError(MultiUIDefaults.java:130)

我打赌委托给 UIManger 是错误的,但我不知道如何忽略自定义项目的当前默认值。有什么想法吗?

谢谢指教

你不能放这个

UIManager.put("MyButton","javax.swing.plaf.ButtonUI");

因为 ButtonUI class 的静态方法 creatUI() (实际上它来自 ComponentUI class)抛出错误

public static ComponentUI createUI(JComponent c) {
        throw new Error("ComponentUI.createUI not implemented.");
    }

所以使用javax.swing.plaf.basic.BasicButtonUI

ignoring current Look and Feel

如果我理解您的要求,我认为最简单的方法是覆盖 JButton#updateUI() - 请参阅选项卡上关闭按钮的教程:

private class TabButton extends JButton implements ActionListener {
    public TabButton() {
        //...
    }

    //we don't want to update UI for this button
    public void updateUI() {
    }