2014-06-24 5 views
1

NetBeans의 Nimbus UI에서 Progressbar의 색상을 Default-Orange에서 Green으로 변경하고 싶습니다.Nimbus 테마에서 ProgressBar Swing UI 조회 변경

나는 다음 줄

for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
       if ("Nimbus".equals(info.getName())) { 
        UIDefaults defaults= UIManager.getDefaults(); 

        javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
        UIManager.getLookAndFeelDefaults().put("ProgressBar[Enabled+Finished].foregroundPainter", Color.GREEN); 
        UIManager.getLookAndFeelDefaults().put("ProgressBar[Enabled+Finished].backgroundPainter", Color.GREEN); 
        break; 
       } 
      } 

이 변경하지 않습니다를 추가했습니다. 코드 또는 다른 해결 방법에 대한 수정이 있습니까?

답변

3

Nimbus는 다른 모양과 느낌처럼 작동하지 않습니다 (예 : Google).

일반적으로 당신은 ColorUIResource를 사용해야하지만, 후광 예를 들어 Painter의의 사용을 선호 ... enter image description here

import java.awt.Color; 
import java.awt.EventQueue; 
import java.awt.GradientPaint; 
import java.awt.Graphics2D; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.RenderingHints; 
import javax.swing.JFrame; 
import javax.swing.JProgressBar; 
import javax.swing.Painter; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.plaf.ColorUIResource; 

public class TestNimbus { 

    public static void main(String[] args) { 
     new TestNimbus(); 
    } 

    public TestNimbus() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"); 

        ProgressPainter painter = new ProgressPainter(Color.WHITE, Color.GREEN); 
        UIManager.getLookAndFeelDefaults().put("ProgressBar[Enabled+Finished].foregroundPainter", painter); 
        //UIManager.getLookAndFeelDefaults().put("ProgressBar[Enabled+Finished].backgroundPainter", painter); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new GridBagLayout()); 
       GridBagConstraints gbc = new GridBagConstraints(); 
       gbc.gridwidth = GridBagConstraints.REMAINDER; 

       JProgressBar pb = new JProgressBar(); 
       frame.add(pb, gbc); 

       pb = new JProgressBar(); 
       pb.setValue(50); 
       frame.add(pb, gbc); 

       pb = new JProgressBar(); 
       pb.setValue(100); 
       frame.add(pb, gbc); 

       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class ProgressPainter implements Painter { 

     private Color light, dark; 
     private GradientPaint gradPaint; 

     public ProgressPainter(Color light, Color dark) { 
      this.light = light; 
      this.dark = dark; 
     } 

     @Override 
     public void paint(Graphics2D g, Object c, int w, int h) { 
      g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
      gradPaint = new GradientPaint((w/2.0f), 0, light, (w/2.0f), (h/2.0f), dark, true); 
      g.setPaint(gradPaint); 
      g.fillRect(2, 2, (w - 5), (h - 5)); 

      Color outline = new Color(0, 85, 0); 
      g.setColor(outline); 
      g.drawRect(2, 2, (w - 5), (h - 5)); 
      Color trans = new Color(outline.getRed(), outline.getGreen(), outline.getBlue(), 100); 
      g.setColor(trans); 
      g.drawRect(1, 1, (w - 3), (h - 3)); 
     } 
    } 
} 

나는 Custom Painter on JProgressBar에서 화가를 훔쳐, 그래서 거기에 신용

+0

나는 같은를 구현하지만이 작동하지 않는 다른에 호출을 하나 하나 개 진행 표시 줄이있을 때 나를 responde하기가 클릭 (대기 다른 GUI 구성 요소). 내 문제를 이해하면 약간의 빛을 던져 주시겠습니까 –

1

나를위한 빠른 해결책 : 자신 만의 Painter를 작성하지 않으면 모든 구성 요소의 색을 nimbusOrange으로 변경하십시오.

UIDefaults defaults = UIManager.getLookAndFeelDefaults(); 
NimbusLookAndFeel localNimbusLookAndFeel = (NimbusLookAndFeel)UIManager.getLookAndFeel(); 
Color derivedColor = localNimbusLookAndFeel.getDerivedColor("nimbusBase", 0.03054375F, -0.3835404F, -0.0980392F, 0, true); 
defaults.put("nimbusOrange",derivedColor); 
+0

'localNimbusLookAndFeel' 변수는 무엇입니까? UIManager.getLookAndFeel()? – MalTec

+0

감사합니다. 현재의 javax.swing.plaf.nimbus.NimbusLookAndFeel' – oliholz

2

이 당신을 도울 수 :

private void paintJProgressBar(Color color, JProgressBar progressBar) { 
    UIDefaults defaults = new UIDefaults(); 
    Painter painter = new MyPainter(color); 
    defaults.put("ProgressBar[Enabled].foregroundPainter", painter); 
    defaults.put("ProgressBar[Enabled+Finished].foregroundPainter", painter); 
    progressBar.putClientProperty("Nimbus.Overrides.InheritDefaults", Boolean.TRUE); 
    progressBar.putClientProperty("Nimbus.Overrides", defaults); 
} 

class MyPainter extends AbstractRegionPainter { 

    private Color fillColor; 

    public MyPainter(Color color) { 
     fillColor = new Color(
       color.getRed(), color.getGreen(), color.getBlue(), 220); 
    } 

    @Override 
    public void doPaint(Graphics2D g, JComponent c, int width, 
         int height, Object[] extendedCacheKeys) { 
     g.setColor(fillColor); 
     g.fillRect(3, 3, width - 6, height - 6); 
    } 

    @Override 
    public PaintContext getPaintContext() { 
     return null; 
    } 

} 
+0

방금 ​​말한 방법에 대해 호언 장담하고 있었지만 약간의 차이가 있다는 것을 깨달았습니다. 차이점이 무엇인지 강조하고 싶습니다) – MadProgrammer

+0

@ MadProgrammer ?? – AvB

+0

당신의 접근 방식은 내가 전에 또는 15 분 전에 게시 한 것과 동일합니다 - 동일한 경로에서 접근 방식이 마음과 다르면 OP가 무엇을 알고 싶어 할 수도 있습니다;) – MadProgrammer