확인
친절 감사 Highchiller 나는 해결책을 가지고 있지만처럼 보이는 꽤 하드 해킹 ... 누군가가 그것을 해결하는 쉬운 방법을 알고 있다면, 말씀해주십시오.
나는 AbstractRegionPainter를 확장 한 원본 ProgressBarPainter.java을 사용합니다. 이름을 BlueProgressBarPainter로 변경합니다. 또한 생성자에서 PaintContext 객체를 가져옵니다. 이 클래스는 AbstractRegionPainter의 보호 된 내부 클래스입니다. 그래서 주어진 매개 변수를 Object로 변경하고 생성자에서 캐스팅합니다. 우리가 "internalBlue" "nimbusOrange"모든 액세스 권한을 변경하고 우리가를 소개하기 전에 후광과 라인 (예를 BLUE 용)이 새로운 색상을 추가 또한
public BlueProgressBarPainter(Object ctx, int state) {
super();
this.state = state;
this.ctx = (AbstractRegionPainter.PaintContext)ctx;
}
: 같은
모든 생성자 보인다 후 새로운 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 wuhu.
안부, Highchiller
그래서 질문은 내가 하나의 구성 요소에 대한 "nimbusOrange"색상을 변경할 수있는 방법입니다 ... – Highchiller