2014-01-21 2 views
0

후광 JProgressBar의 기본 색을 변경하려고합니다. 나는 "nimbusOrange"를 변경하여 전역 색상을 변경할 수 있습니다. 나는 그 결과를 좋아한다. 하지만 원래의 nimbus에서 하나의 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를 넣어 경우는

도움이 ... ProgressBar의 단지 일반 오렌지 스타일을 보여줍니다?

+0

그래서 질문은 내가 하나의 구성 요소에 대한 "nimbusOrange"색상을 변경할 수있는 방법입니다 ... – Highchiller

답변

0

확인

친절 감사 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