2014-04-22 38 views
1

我正在编写自定义JComponent,对于不同的外观和感觉应该看起来不同。我打算至少有WindowsLookAndFeel,MetalLookAndFeelMotifLookAndFeel不同ComponentUi类。使用自定义JComponents扩展现有Swing外观和感觉

现在,虽然此任务看起来很简单,但我无法找到如何使用我的自定义ComponentUi类轻松扩展现有外观。

我将如何去注册正确的ComponentUi为不同的外观和感觉?这可能吗?如果不是,为不同的外观和感觉编写自定义组件的首选方法是什么?


更具体一点,此刻我重写JComponent#updateUI在我的自定义组件来设置不同的ComponentUi实例:

@Override 
public void updateUI() { 
    LookAndFeel feel = UIManager.getLookAndFeel(); 
    if (feel instanceof WindowsLookAndFeel) { 
     setUI(MyWindowsCustomUi.createUI(this)); 
    } else if (feel instanceof MotifLookAndFeel) { 
     setUI(MyMotivCustomUi.createUI(this)); 
    } else if (feel instanceof MetalLookAndFeel) { 
     setUI(MyMetalCustomUi.createUI(this)); 
    } else{ 
     setUI(MyBasicCustomUi.createUI(this)); 
    } 
} 

但这种做法似乎完全打败的目的和外观和感觉的有用性。我希望能够将此更改为以下:

public void updateUI() { 
    setUI((MyCustomUi)UIManager.getUI(this)); 
} 

,这应该设置MyCustomUi正确的子类为当前的外观和感觉。

我知道,我可以通过创建每个受支持的LookAndFeel的自定义子类来轻松实现此目的,这些子类在例如注册期间注册相应的ComponentUiBasicLookAndFeel#initComponentDefaults(UIDefaults) - 但这不是我想要做的。

回答

4

如果你想它呢 - 你与UIManager的莫名其妙注册您的定制用户界面,这是怎么回事能知道他们;-)

你不需要的东西,虽然是一个支持的LAF的自定义子类:您可以手动注册它们(并且在LAF更改时更新注册,也就是说您需要在此类情况下通知UIManager上的propertyChangeListener)。

假设与“CustomUI”的一个的classID和JCustom按照通常惯例UI实现(即BasicCustomUI,WindowsCustomUI ...)的注册会是这样的:

String prefix = UIManager.getLookAndFeel().getID(); 
UIManager.getLookAndFeelDefaults().put("CustomUI", myUIPackage + "." + prefix + CustomUI); 

注意,自定义用户界面需要一个静态createUI中它返回UI的一个实例:

public static ComponentUI createUI(JComponent comp) { 
    return new BasicCustomUI(); 
} 

和部件需要发布其uiClassID,查找并设置其用户界面:

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

@Override 
public void updateUI() { 
    setUI(UIManager.getUI(this)); 
} 

使用SwingX的好处是提供自动注册自定义组件的基础结构。你需要一个额外的类 - CustomAddon - 它提供了每LAF配置和自定义组件有利于该插件:

// in JCustom 

static { 
    LookAndFeelAddons.contribute(new CustomAddon()); 
} 

// in CustomAddon 

@Override 
protected void addBasicDefaults(LookAndFeelAddons addon, DefaultsList defaults) { 
    super.addBasicDefaults(addon, defaults); 
    defaults.add("CustomUI", 
      "mypackage.BasicCustomUI"); 
} 

@Override 
protected void addMacDefaults(LookAndFeelAddons addon, DefaultsList defaults) { 
    super.addMacDefaults(addon, defaults); 
    defaults.add("CustomUI", 
      "mypackage.MacCustomUI"); 
} 

//... similar methods for all supported LAFs 
+0

非常感谢你 - 我注册使用'LookAndFeelAddons.contribute自定义组件() '来自SwingX,它就像一个魅力。 – Balder