Bin zwar kein Fan davon, komplette Lösungen zu posten, aber da mir meine Arbeit gerade echt gefällt will ich diese dann doch gerne Teilen :). Aber immerhin: der Code kann definitiv noch etwas pflege gebrauchen. Solltest du es verwenden wollen, überlasse ich es dir selbigen für dein Projekt aufzuräumen :-P.
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.LinearGradientPaint;
import java.awt.Paint;
import java.awt.geom.Point2D;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
@SuppressWarnings("serial")
public class PaintTest extends JComponent {
private float progress = 0.0f;
private boolean simpleMode = true;
private Color[] simpleColors = {
Color.ORANGE,
Color.GREEN
};
private Color[] extendedColors = {
Color.RED,
Color.ORANGE,
Color.GREEN,
Color.GREEN.darker()
};
public static void main(final String[] args) {
final JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final PaintTest test = new PaintTest();
test.setPreferredSize(new Dimension(400, 20));
test.setProgress(0.0f);
test.setSimpleMode(true);
frame.add(test, BorderLayout.NORTH);
final PaintTest test2 = new PaintTest();
test2.setPreferredSize(new Dimension(400, 20));
test2.setProgress(0.0f);
test2.setSimpleMode(false);
frame.add(test2, BorderLayout.SOUTH);
frame.setSize(new Dimension(400, 90));
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
new Thread() {
@Override
public void run() {
for(float i = .0f; i <= 1.0; i+=0.01) {
test.setProgress(i);
test2.setProgress(i);
try {
Thread.sleep(25);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
}
@Override
protected void paintComponent(final Graphics g) {
Graphics2D g2d = (Graphics2D) g;
drawBackground(g2d);
if(simpleMode) {
drawSimpleProgress(g2d);
} else {
drawProgress(g2d);
//drawProgress(g2d);
}
drawOverlay(g2d);
drawBoarder(g2d);
}
private void drawOverlay(final Graphics2D g) {
Graphics2D g2d = (Graphics2D) g.create();
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f));
g2d.setPaint(new GradientPaint(new Point2D.Float(getWidth()/2, 0), Color.WHITE, new Point2D.Float(getWidth()/2, getHeight()), Color.GRAY));
g2d.fillRect(0,0,(int) (getWidth()*progress),getHeight());
g2d.dispose();
}
private void drawBackground(final Graphics2D g) {
Paint paint = g.getPaint();
g.setPaint(new GradientPaint(new Point2D.Float(getWidth()/2, 0), Color.WHITE, new Point2D.Float(getWidth()/2, getHeight()), Color.LIGHT_GRAY));
g.fillRect(0, 0, getWidth()-1, getHeight()-1);
g.setPaint(paint);
}
private void drawSimpleProgress(final Graphics2D g) {
Paint paint = g.getPaint();
g.setPaint(new GradientPaint(new Point2D.Float(0, getHeight()/2), simpleColors[0], new Point2D.Float(getWidth(), getHeight()/2), simpleColors[1]));
g.fillRect(0, 0, (int) (getWidth()*progress), getHeight()-1);
g.setPaint(paint);
}
private void drawProgress(final Graphics2D g) {
Graphics2D g2d = (Graphics2D) g.create();
float[] dist = {0f, .33f, .66f, 1f};
g2d.setPaint(new LinearGradientPaint(new Point2D.Float(0, getHeight()/2), new Point2D.Float(getWidth(), getHeight()/2), dist, extendedColors));
g2d.fillRect(0, 0, (int) (getWidth()*progress), getHeight());
g2d.dispose();
}
private void drawBoarder(final Graphics2D g) {
g.setColor(Color.BLACK);
g.drawRect(0, 0, getWidth()-1, getHeight()-1);
}
public void setProgress(final float progress) {
this.progress = progress;
repaint();
}
public void setSimpleMode(final boolean simpleMode) {
this.simpleMode = simpleMode;
}
}