好吧,我得到了解決,但它看起來像一個相當困難的破解......如果有人知道解決這個問題的簡單方法,請告訴我。
我採用了擴展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
所以,問題是,我怎樣才能改變「nimbusOrange」顏色只有一個組件... – Highchiller