如何创建忽略当前外观的自定义 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
并进行一些设置(Foreground
、Background
、 Font
等等), 由于默认值 而无法按我的意愿行事(例如,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() {
}
我有一个应用程序具有默认的外观 (insubstantial
) 并且设置了许多默认值,例如:
UIManager.put( "List.foreground", Color.BLACK );
UIManager.put( xyz, zyzLEF );
//around 150 istructions like that
此应用程序非常庞大,并且有许多根据客户需求定制的覆盖,但是现在我需要创建自己的 JButton
并进行一些设置(Foreground
、Background
、 Font
等等), 由于默认值 而无法按我的意愿行事(例如,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() {
}