2014-01-21 20 views
0

我嘗試更改nimbus JProgressBar的默認顏色。我可以通過更改「nimbusOrange」來更改全局顏色。我喜歡那個結果。但是我需要在nimbus的原始nimbusOrange中使用一個ProgressBar,並且在藍色的同一程序中包含另一個ProgressBar。我試試這個:更改一個組件的Nimbus ProgressBar

JProgressBar progressBar = new JProgressBar(); 

UIDefaults overrides = new UIDefaults(); 
overrides.put("nimbusOrange", Color.BLUE); 
overrides.put("ProgressBar[Enabled].backgroundPainter", UIManager.get("ProgressBar[Enabled].backgroundPainter")); 
//overrides.put("ProgressBar[Enabled].foregroundPainter", UIManager.get("ProgressBar[Enabled].foregroundPainter")); 
progressBar.putClientProperty("Nimbus.Overrides", overrides); 
progressBar.putClientProperty("Nimbus.Overrides.InheritDefaults", false); 

但如果我把foregroundPainter回到代碼它卻與此進度正常橙色風格。

任何幫助嗎?

親切的問候 Highchiller

+0

所以,問題是,我怎樣才能改變「nimbusOrange」顏色只有一個組件... – Highchiller

回答

0

好吧,我得到了解決,但它看起來像一個相當困難的破解......如果有人知道解決這個問題的簡單方法,請告訴我。

我採用了擴展AbstractRegionPainter的原始ProgressBarPainter.java。我將名稱更改爲BlueProgressBarPainter。它也在構造函數中獲得一個PaintContext對象。該類是AbstractRegionPainter的受保護的內部類。所以我將給定的參數更改爲Object並將其轉換爲構造函數。

畢竟構造的樣子:

public BlueProgressBarPainter(Object ctx, int state) { 
    super(); 
    this.state = state; 
    this.ctx = (AbstractRegionPainter.PaintContext)ctx; 
} 

此外,我們改變「nimbusOrange」到「internalBlue」的所有訪問和我們介紹之前添加這個新的顏色(例如藍色),以靈氣和行新的LookAndFeel:

UIManager.put("internalBlue", Color.BLUE); 

好吧......好吧。 現在我們必須添加我們自己的畫家到具體的progressBar。但是我們需要原畫家的AbstractRegionPainter.PaintContext對象。爲了得到這個,我們需要反思!導致AbstractRegionPainter中的方法「getPaintContext()」受到保護。

// initialize progressBar 
    JProgressBar progressBar = new JProgressBar(); 

    // create own UIDefaults 
    UIDefaults overrides = new UIDefaults(); 
    BlueProgressBarPainter painter = null; 

    // get the original AbstractRegionPainter of Nimbus 
    AbstractRegionPainter abstractPainter = (AbstractRegionPainter)UIManager.get("ProgressBar[Enabled].foregroundPainter"); 

    // reflection begin 
    try { 
     Class<?> clazz = abstractPainter.getClass(); 
     // get the protected Method of AbstractRegionPainter 
     Method protectedMethod = clazz.getDeclaredMethod("getPaintContext"); 
     protectedMethod.setAccessible(true); 

     // create now our own Painter with the original AbstractRegionPainter.PaintContext 
     painter = new BlueProgressBarPainter( 
       (Object) protectedMethod.invoke(abstractPainter) , 
       3); // 3 is constant for "FOREGROUND_ENABLED" 
    } catch (Exception e) {} 

    // set original background painter 
    overrides.put("ProgressBar[Enabled].backgroundPainter", UIManager.get("ProgressBar[Enabled].backgroundPainter")); 
    // set own foreground painter 
    overrides.put("ProgressBar[Enabled].foregroundPainter", painter); 
    // accept overrides 
    progressBar.putClientProperty("Nimbus.Overrides", overrides); 
    progressBar.putClientProperty("Nimbus.Overrides.InheritDefaults", false); 

這是非常困難的,我認爲...但它的作品o.O蕪湖。

最好的問候, Highchiller

相關問題