[quote=entanglement][code]
package guj;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.Arc2D;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Line2D;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JPanel;
public class GraficoNivel extends JPanel {
public static class Valor {
private double valor;
private String legenda;
public Valor (double valor, String legenda) {
this.valor = valor; this.legenda = legenda;
}
public double getValor() {
return valor;
}
public void setValor(double valor) {
this.valor = valor;
}
public String getLegenda() {
return legenda;
}
public void setLegenda(String legenda) {
this.legenda = legenda;
}
};
public GraficoNivel() {
super();
}
private List<Valor> valores = new ArrayList<Valor>();
public void add (Valor valor) {
valores.add (valor);
System.out.println (valores);
}
public void clear() {
valores.clear();
}
public void setDivisoes (int nDivisoes) {
this.nDivisoes = nDivisoes;
}
private void normalize (Graphics2D g2d, Dimension dim) {
g2d.translate(dim.width / 2, dim.height / 2);
g2d.scale((dim.width - 2) / 2, -(dim.height - 2) / 2);
}
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g.create();
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
// Devemos a princípio determinar as dimensões, de forma que possamos normalizar
// para um sistema de coordenadas com -1 <= x <= +1 e -1 <= y <= +1, e com o
// eixo dos x apontando para cima, não para baixo.
normalize (g2d, getSize());
g2d.setStroke(new BasicStroke(0.01f));
// Vamos desenhar as fatias, de acordo om seus respectivos raios
for (int i = 1; i <= valores.size(); ++i) {
double radius = valores.get(i-1).getValor();
double angle = 360 / valores.size();
g2d.setPaint (new Color ((int) (255 * i / valores.size()), (int) (255 * i / valores.size()), (int) (255 * i / valores.size())));
System.out.println (radius);
Arc2D.Double d = new Arc2D.Double (-radius, -radius, 2 * radius, 2 * radius, 270- (int) (angle * (i-1)), (int) angle, Arc2D.PIE);
g2d.fill (d);
}
g2d.setPaint(Color.BLACK);
// Vamos desenhar agora os raios (um para cada Valor)
System.out.println (valores.size());
for (int i = 0; i < valores.size(); ++i) {
double theta = 2 * Math.PI * i / valores.size();
g2d.draw (new Line2D.Double(0, 0, Math.sin(theta), Math.cos(theta)));
}
// Agora, vamos desenhar a quantidade de subdivisões
for (int i = 1; i <= nDivisoes; ++i) {
double radius = i * 1.0 / nDivisoes;
Ellipse2D.Double d = new Ellipse2D.Double(-radius, -radius, 2*radius, 2*radius);
g2d.draw(d);
}
g2d.dispose();
}
private int nDivisoes = 3;
}
[/code]
Exemplo de uso.
[code]
package guj;
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class ExemploGraficoNivel extends JFrame {
private static final long serialVersionUID = 1L;
private JPanel jContentPane = null;
private GraficoNivel grfNivel = null;
private GraficoNivel getGrfNivel() {
if (grfNivel == null) {
grfNivel = new GraficoNivel();
grfNivel.setDivisoes(5);
grfNivel.add (new GraficoNivel.Valor(0.5, "meio"));
grfNivel.add (new GraficoNivel.Valor(0.7, "meio"));
grfNivel.add (new GraficoNivel.Valor(0.9, "meio"));
grfNivel.add (new GraficoNivel.Valor(1.2, "meio"));
grfNivel.add (new GraficoNivel.Valor(0.6, "meio"));
}
return grfNivel;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
ExemploGraficoNivel thisClass = new ExemploGraficoNivel();
thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
thisClass.setVisible(true);
}
});
}
public ExemploGraficoNivel() {
super();
initialize();
}
private void initialize() {
this.setSize(300, 300);
this.setContentPane(getJContentPane());
this.setTitle("Teste Gráfico Nível");
}
private JPanel getJContentPane() {
if (jContentPane == null) {
jContentPane = new JPanel();
jContentPane.setLayout(new BorderLayout());
jContentPane.add(getGrfNivel(), BorderLayout.CENTER);
}
return jContentPane;
}
}
[/code][/quote]
Muito obrigado a todos, principalmente ao amigo entanglement!!