LookAndFeel Wie kann man die Textfarbe der Nimbus ProgressBar nach Füllstand ändern?

RFJ

Neues Mitglied
Beim Windows look&feel ändert sich die Textfarbe von "selectionForeground" zu "selectionBackground", wenn die Fortschrittsanzeige am Text ankommt. Bei Nimbus scheint das nicht zu passieren. Kann man das bei Nimbus irgendwie einstellen, bzw. kriegt man das irgendwie manuell hin?
Genaugenommen verwende ich das Windows look&feel und kopier da die Daten der Nimbus ProgressBar rein.
zZ wird der Text der ProgressBar halt unleserlich weil der Text dunkel ist und die Fortschrittsanzeige auch.
 
Ich wusste doch, dass mir das bekannt vorkam. Man, ist auch schon wieder fast zwei Jahre her... Hier nochmal die Klasse und auch ein kleines Beispiel. Damals hab ich wohl keins gepostet? Egal, so könnte man es machen:
Code:
import java.awt.Color;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.geom.AffineTransform;

import javax.swing.BoundedRangeModel;
import javax.swing.JProgressBar;


public class MyJProgressBar2 extends JProgressBar
{
    private static final long serialVersionUID = 7011699579650095776L;
    private boolean stringPaintedOverride = false;
    private Color textColorOutsidePaint = Color.BLACK;
    private Color textColorInsidePaint = Color.WHITE;
   
    public MyJProgressBar2()
    {
        setStringPainted(false);
    }
   
    @Override
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);
       
        if(stringPaintedOverride)
        {
            drawString(g);
        }
    }
   
    @Override
    public void setStringPainted(boolean painted)
    {
        super.setStringPainted(false);
        setStringPaintedOverride(painted);
    }
   
    private void setStringPaintedOverride(boolean stringPaintedOverride)
    {
        this.stringPaintedOverride = stringPaintedOverride;
    }
   
    public void setTextColorOutsidePaint(Color textColorOutsidePaint)
    {
        this.textColorOutsidePaint = textColorOutsidePaint;
    }
   
    public void setTextColorInsidePaint(Color textColorInsidePaint)
    {
        this.textColorInsidePaint = textColorInsidePaint;
    }
   
    private void drawString(Graphics g)
    {
        g.setFont(getFont());
        Rectangle oldClip = g.getClipBounds();
       
        Insets b = getInsets(); // area for border
        int barRectWidth = getWidth() - (b.right + b.left);
        int barRectHeight = getHeight() - (b.top + b.bottom);
       
        int amountFull = 0;
        BoundedRangeModel model = getModel();
       
        if ( (model.getMaximum() - model.getMinimum()) != 0) {
            if (getOrientation() == JProgressBar.HORIZONTAL) {
                amountFull = (int)Math.round(barRectWidth *
                             getPercentComplete());
            } else {
                amountFull = (int)Math.round(barRectHeight *
                             getPercentComplete());
            }
        }
       
        int fillStart;
        Point renderLocation = getStringPlacement(g);
       
        if (getOrientation() == JProgressBar.HORIZONTAL)
        {
            if(getComponentOrientation().isLeftToRight())
                fillStart = b.left;
            else
                fillStart = b.left + barRectWidth - amountFull;
           
            g.setColor(textColorOutsidePaint);
            drawString(g, renderLocation.x, renderLocation.y);
           
            g.setColor(textColorInsidePaint);
            g.clipRect(fillStart, b.top, amountFull, barRectHeight);
            drawString(g, renderLocation.x, renderLocation.y);
        }
        else
        {
            // VERTICAL
            fillStart = b.top + barRectHeight - amountFull;
           
            AffineTransform rotate = AffineTransform.getRotateInstance(Math.PI / 2);
            g.setFont(getFont().deriveFont(rotate));
            g.setColor(textColorOutsidePaint);
            drawString(g, renderLocation.x, renderLocation.y);
           
            g.setColor(textColorInsidePaint);
            g.clipRect(b.left, fillStart, barRectWidth, amountFull);
            drawString(g, renderLocation.x, renderLocation.y);
        }
       
        g.setClip(oldClip);
    }
   
    private Point getStringPlacement(Graphics g)
    {
        FontMetrics fontSizer = getFontMetrics(getFont());
        if (getOrientation() == JProgressBar.HORIZONTAL)
        {
            int x = (getWidth() / 2) - (int)Math.round(fontSizer.getStringBounds(progressString, g).getWidth() / 2);
            int y = (getHeight() - (int)Math.round((getHeight()-fontSizer.getStringBounds(progressString, g).getHeight()) / 2)) - 3;
            return new Point(x, y);
        }
        else
        {
            // VERTICAL
            int x = ((getWidth() / 2) - (int)Math.round(fontSizer.getStringBounds(progressString, g).getHeight() / 2)) + 4;
            int y = (int)Math.round((getHeight() - fontSizer.getStringBounds(progressString, g).getWidth()) / 2);
            return new Point(x, y);
        }
    }
   
    private void drawString(Graphics g, int x, int y)
    {
        if(g != null)
        {
            if(isIndeterminate())
                g.setColor(Color.BLACK);
           
            g.drawString(progressString, x, y);
        }
    }
}


Code:
SwingUtilities.invokeLater(new Runnable() {
	
	@Override
	public void run()
	{
		JFrame frame = new JFrame("Test Frame");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		
		
		final JProgressBar bar = new MyJProgressBar2();
		bar.setMinimum(0);
		bar.setMaximum(100);
		bar.setStringPainted(true);
		bar.setString("0%");
		
		final Timer t = new Timer();
		t.schedule(new TimerTask() {
			
			private int currentValue = 0;
			
			@Override
			public void run()
			{
				if(currentValue <= 100)
				{
					bar.setString(String.format("%d%%", currentValue));
					bar.setValue(currentValue);
					bar.revalidate();
					bar.repaint();
					
					currentValue++;
				}
				else
				{
					t.cancel();
				}
			}
			
		}, 400, 100);
		
		
		frame.add(bar);
		frame.setSize(300, 70);
		frame.setLocationRelativeTo(null);
		frame.setVisible(true);				
	}
});

Hinweis: der Timer ist ein java.util.Timer.
 

Neue Themen


Zurück
Oben