2014-04-22 65 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