[quote=vinipta]Olá pessoal,
preciso trabalhar com gráficos de barras dinâmicos em uma aplicação
java desktop que utiliza Swing. Já me indicaram o JFreeChart, mas pelo
que vi, ele não possui gráficos dinâmicos de barras.
Quando falo de gráficos dinâmicos, significa que eu preciso alterar os
dados do gráfico, sem ser preciso criar uma nova instancia do mesmo
para exibir a alteração dos dados.
Desde já agradeço a todos.
Um gde abço!!![/quote]
RESOLVENDO MAIS UM EXERCÍCIO DE FACULDADE
não deveria, mas vou dar um exemplo de grafico dinâmico q eu comecei a
desenvolver (JÁ TÁ ANIMADO - VC CONFIGURA SE KER Q SEJA ANIMADO) …
TENTA ENTENDER POIS THA FACIL, E DEPOIS VC PODE USAR O JFREECHART
MESMO … É DE GRAÇA … UMA DICA É SEMPRE LEMBRAR DE NÃO FICAR
“AMMARADO” A NENHUM OUTRO FRAMEWORK, PELO MENOS NÃO NO APRENDIZADO, E
DEPOIS SIM PARTIR PARA UM JÁ DESENVOLVIDO E AMADURECIDO … USAR ALGUM
PAGO, NÃO É ACONSELHÁVEL ! MAS DECIDA POR VC MESMO.
tente entender, e se necessário for, envie uma pergunte.
E como o código q eu ainda estava realizado tá sem teste JUnit, q tal
fazê-los ?
Fique a vontade para realizar refactor do código utilizando sua
própria nomenclatura/estrutura.
KubicSwingTagChartBarPanel - Ele extends JPanel - então ele é um
JPanel - to bonzinho e coloquei um main pra facilitar. Eu estou o
utilizando como um componente Panel dentro de um framework q estou a
terminar.
package br.com.kubic.kubicFramework.swing.tags.panel;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.Paint;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Rectangle2D;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import br.com.kubic.kubicFramework.internalCore.bean.KubicChartBean;
import
br.com.kubic.kubicFramework.internalCore.services.bigDecimal.KubicBigD
ecimal;
public class KubicSwingTagChartBarPanel extends JPanel implements
ActionListener {
boolean animatedChart = false;
private static int DELAY = 10;
private Insets insets;
private int counter = 0;
private double[] theValor = null;
private int values[] = { 100, 10, 50, 50, 50, 50 };
private int[] barra;
private int[] starter;
private Color[] corDaBarra;
private Color[] coresPossiveis = { Color.RED, Color.CYAN,
Color.blue,
Color.green, Color.yellow, Color.orange,
Color.pink };
private int steps = values.length;
private int stepSize = 360 / steps;
public double tamanho = 0;
private double valueToView = 0;
private double valueToView2 = 0;
private int alturaBarraMax = 0;
private double maximo = 0;
private String theTitle;
private RenderingHints hints = null;
private String[] labels = null;
private int larguraBarra = 100;
private Graphics2D g2 = null;
public KubicChartBean chartBean2 = null;
private TimerTask task = null;
public void repaint() {
if (chartBean2 != null && g2 != null) {
this.theValor = chartBean2.getValor();
this.labels = chartBean2.getLabels();
this.theTitle = chartBean2.getTitulo();
this.animatedChart = chartBean2.isAnimate();
// cria numero de barras igual a quantidade
// de numeros passados
int tamanho = theValor.length;
barra = new int[tamanho];
corDaBarra = new Color[tamanho];
// descobre o maior valor
double maximo = 0;
for (int count = 0; count < tamanho; count++)
{
if (theValor[count] > maximo) {
maximo = theValor[count];
}
}
// guarda a informacao em valores relativos ao
// maximo, onde este vale 100 e outros valem
// uma porcentagem deste maximo sem casas
decimais
for (int count = 0; count < tamanho; count++)
{
barra[count] = (int) (100 *
(theValor[count] / maximo));
corDaBarra[count] =
coresPossiveis[count
%
coresPossiveis.length];
}
if (animatedChart) {
starter = new int[values.length];
int larguraJanela = getWidth();
int alturaJanela = getHeight();
int baseBarras = alturaJanela - 50;
int quantidadeDeBarras = barra.length;
int tamanhoItem = (larguraJanela /
quantidadeDeBarras);
int espacoEsquerda = 20;
// int larguraBarra = (int) (0.8 *
tamanhoItem);
alturaBarraMax = alturaJanela - 70 -
50;
String titulo = this.theTitle;
for (int count = 0; count <
quantidadeDeBarras; count++) {
int altura = (int)
((barra[count] * alturaBarraMax) / 100);
int x2 = count * tamanhoItem +
espacoEsquerda;
// int y2 = baseBarras -
altura;
int y2 = baseBarras;
// System.out.println("altura"
+ altura );
if (tamanho <= alturaBarraMax)
{
valueToView =
((tamanho / alturaBarraMax) * theValor[count]) * 1.1;
valueToView2 =
((tamanho / alturaBarraMax) * barra[count]) * 1.1;
}
Rectangle2D r = new
Rectangle2D.Double(0, 0, larguraBarra,
20);
if (tamanho < altura) {
/*
*
g2.setColor(corDaBarra[count]); r = new
*
Rectangle2D.Double(x2, y2 - tamanho, larguraBarra,
* tamanho);
*/
int
indiceFaddingInicial = 255;
int theIndiceFadding =
(int) (indiceFaddingInicial * (tamanho / alturaBarraMax));
Color
theColorBarraFadding = new Color(
corDaBarra[count].getRed(), corDaBarra[count]
.getGreen(), corDaBarra[count]
.getBlue(), theIndiceFadding);
g2.setColor(theColorBarraFadding);
r = new
Rectangle2D.Double(x2, y2 - tamanho,
larguraBarra, tamanho);
}
else {
valueToView2 =
barra[count];
g2.setColor(corDaBarra[count]);
r = new
Rectangle2D.Double(x2, baseBarras - altura,
larguraBarra, altura);
}
g2.fill(r);
//
g2.drawString(KubicBigDecimal.getParteInteira(theValor[count],
// 2) + "." +
//
KubicBigDecimal.getParteCentavos(theValor[count], 2) + "
// =" + " " +
KubicBigDecimal.getParteInteira(barra[count],
// 2) + "." +
KubicBigDecimal.getParteCentavos(barra[count],
// 2) + "% " , x2,
baseBarras+15);
g2.setColor(Color.white);
if (tamanho < altura &&
valueToView < theValor[count]) {
g2.drawString(KubicBigDecimal.getParteInteira(
valueToView, 2)
+ "."
+
KubicBigDecimal.getParteCentavos(valueToView,
2)
+ " ="
+ " "
+
KubicBigDecimal.getParteInteira(valueToView2,
2)
+ "."
+
KubicBigDecimal.getParteCentavos(
valueToView2, 2) + "% ", x2,
baseBarras + 15);
}
else {
altura = (int)
((barra[count] * alturaBarraMax) / 100);
g2.drawString(KubicBigDecimal.getParteInteira(
theValor[count], 2)
+ "."
+
KubicBigDecimal.getParteCentavos(
theValor[count], 2)
+ " ="
+ " "
+
KubicBigDecimal.getParteInteira(barra[count],
2)
+ "."
+
KubicBigDecimal.getParteCentavos(
barra[count], 2) + "% ", x2,
baseBarras + 15);
}
//
g2.drawString(KubicBigDecimal.getParteInteira(theValor[count],
// 2) + "." +
//
KubicBigDecimal.getParteCentavos(theValor[count], 2) + "
// =" + " " +
KubicBigDecimal.getParteInteira(barra[count],
// 2) + "." +
KubicBigDecimal.getParteCentavos(barra[count],
// 2) + "% " , x2,
baseBarras+15);
}
}
}
super.repaint();
}
public KubicSwingTagChartBarPanel(KubicChartBean chartBean) {
chartBean2 = chartBean;
this.theValor = chartBean.getValor();
this.labels = chartBean.getLabels();
this.theTitle = chartBean.getTitulo();
this.animatedChart = chartBean.isAnimate();
// DEFINICOES DE RENDEREIZACAO
hints = new
RenderingHints(RenderingHints.KEY_ALPHA_INTERPOLATION,
RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
hints.put(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
hints.put(RenderingHints.KEY_COLOR_RENDERING,
RenderingHints.VALUE_COLOR_RENDER_QUALITY);
hints.put(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);
hints.put(RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);
// cria numero de barras igual a quantidade
// de numeros passados
int tamanho = theValor.length;
barra = new int[tamanho];
corDaBarra = new Color[tamanho];
// descobre o maior valor
double maximo = 0;
for (int count = 0; count < tamanho; count++) {
if (theValor[count] > maximo) {
maximo = theValor[count];
}
}
// guarda a informacao em valores relativos ao
// maximo, onde este vale 100 e outros valem
// uma porcentagem deste maximo sem casas decimais
for (int count = 0; count < tamanho; count++) {
barra[count] = (int) (100 * (theValor[count] /
maximo));
corDaBarra[count] = coresPossiveis[count %
coresPossiveis.length];
}
}
public void paintComponent(Graphics graphics) {
if (hints != null) {
counter++;
g2 = (Graphics2D) graphics;
g2.setRenderingHints(hints);
super.paintComponent(g2);
// GRADIENTE PANEL
final int heightGradiente = getHeight();
Color gradientStart = new Color(0, 0, 0);//
220, 255, 149);
Color gradientEnd = new Color(0, 0, 0);// 183,
234, 98);
GradientPaint painter = new GradientPaint(0,
0, gradientStart, 0,
heightGradiente, gradientEnd);
final Paint oldPainter = g2.getPaint();
g2.setPaint(painter);
g2.fill(g2.getClip());
gradientStart = new Color(0, 0, 0, 200);
gradientEnd = new Color(0, 0, 0, 255);
painter = new GradientPaint(0, 0, gradientEnd,
0,
heightGradiente / 2,
gradientStart);
g2.setPaint(painter);
g2.fill(g2.getClip());
painter = new GradientPaint(0, heightGradiente
/ 2, gradientStart,
0, heightGradiente,
gradientEnd);
g2.setPaint(painter);
g2.fill(g2.getClip());
g2.setPaint(oldPainter);
this.setBackground(Color.black);
Rectangle2D r = new Rectangle2D.Double(0, 0,
larguraBarra, 20);
if (insets == null) {
insets = getInsets();
}
starter = new int[values.length];
int larguraJanela = getWidth();
int alturaJanela = getHeight();
int baseBarras = alturaJanela - 50;
int quantidadeDeBarras = barra.length;
int tamanhoItem = (larguraJanela /
quantidadeDeBarras);
int espacoEsquerda = 20;
// int larguraBarra = (int) (0.8 *
tamanhoItem);
alturaBarraMax = alturaJanela - 70 - 50;
String titulo = this.theTitle;
g2.setColor(Color.white);
Font fonte = new Font("Tahoma", Font.BOLD,
20);
g2.setFont(fonte);
g2.drawString(titulo, espacoEsquerda - 1,
baseBarras
- alturaBarraMax - 35);
for (int count = 0; count <
quantidadeDeBarras; count++) {
int altura = (int) ((barra[count] *
alturaBarraMax) / 100);
int x2 = count * tamanhoItem +
espacoEsquerda;
int y2 = baseBarras - altura;
r = new Rectangle2D.Double(x2 - 2, y2
- 2, larguraBarra + 3,
altura + 3);
g2.setColor(Color.white);
g2.draw(r);
// g2d.drawString("" + (count+1) + "-"
+ labels[count], x+1,
// baseBarras-altura-10);
String theLabelForGraphic =
labels[count].toUpperCase();
int numeroMaximoCaracteresLabel = 15;
if (theLabelForGraphic.length() >
numeroMaximoCaracteresLabel) {
theLabelForGraphic =
theLabelForGraphic.substring(0,
numeroMaximoCaracteresLabel);
}
fonte = new Font("Tahoma",
Font.ITALIC, 11);
g2.setFont(fonte);
g2.drawString("" + theLabelForGraphic,
x2 + 1, baseBarras
- altura - 10);
}
if (animatedChart) {
for (int count = 0; count <
quantidadeDeBarras; count++) {
int altura = (int)
((barra[count] * alturaBarraMax) / 100);
int x2 = count * tamanhoItem +
espacoEsquerda;
// int y2 = baseBarras -
altura;
int y2 = baseBarras;
// System.out.println("altura"
+ altura );
if (tamanho <= alturaBarraMax)
{
valueToView =
((tamanho / alturaBarraMax) * theValor[count]) * 1.1;
valueToView2 =
((tamanho / alturaBarraMax) * barra[count]) * 1.1;
}
if (tamanho < altura) {
/*
*
g2.setColor(corDaBarra[count]); r = new
*
Rectangle2D.Double(x2, y2 - tamanho, larguraBarra,
* tamanho);
*/
int
indiceFaddingInicial = 255;
int theIndiceFadding =
(int) (indiceFaddingInicial * (tamanho / alturaBarraMax));
Color
theColorBarraFadding = new Color(
corDaBarra[count].getRed(), corDaBarra[count]
.getGreen(), corDaBarra[count]
.getBlue(), theIndiceFadding);
g2.setColor(theColorBarraFadding);
r = new
Rectangle2D.Double(x2, y2 - tamanho,
larguraBarra, tamanho);
}
else {
valueToView2 =
barra[count];
g2.setColor(corDaBarra[count]);
r = new
Rectangle2D.Double(x2, baseBarras - altura,
larguraBarra, altura);
}
g2.fill(r);
//
g2.drawString(KubicBigDecimal.getParteInteira(theValor[count],
// 2) + "." +
//
KubicBigDecimal.getParteCentavos(theValor[count], 2) + "
// =" + " " +
KubicBigDecimal.getParteInteira(barra[count],
// 2) + "." +
KubicBigDecimal.getParteCentavos(barra[count],
// 2) + "% " , x2,
baseBarras+15);
g2.setColor(Color.white);
if (tamanho < altura &&
valueToView < theValor[count]) {
g2.drawString(KubicBigDecimal.getParteInteira(
valueToView, 2)
+ "."
+
KubicBigDecimal.getParteCentavos(valueToView,
2)
+ " ="
+ " "
+
KubicBigDecimal.getParteInteira(valueToView2,
2)
+ "."
+
KubicBigDecimal.getParteCentavos(
valueToView2, 2) + "% ", x2,
baseBarras + 15);
}
else {
altura = (int)
((barra[count] * alturaBarraMax) / 100);
g2.drawString(KubicBigDecimal.getParteInteira(
theValor[count], 2)
+ "."
+
KubicBigDecimal.getParteCentavos(
theValor[count], 2)
+ " ="
+ " "
+
KubicBigDecimal.getParteInteira(barra[count],
2)
+ "."
+
KubicBigDecimal.getParteCentavos(
barra[count], 2) + "% ", x2,
baseBarras + 15);
}
//
g2.drawString(KubicBigDecimal.getParteInteira(theValor[count],
// 2) + "." +
//
KubicBigDecimal.getParteCentavos(theValor[count], 2) + "
// =" + " " +
KubicBigDecimal.getParteInteira(barra[count],
// 2) + "." +
KubicBigDecimal.getParteCentavos(barra[count],
// 2) + "% " , x2,
baseBarras+15);
}
}
else {
for (int count = 0; count <
quantidadeDeBarras; count++) {
int altura = (int)
((barra[count] * alturaBarraMax) / 100);
int x2 = count * tamanhoItem +
espacoEsquerda;
// int y2 = baseBarras -
altura;
int y2 = baseBarras;
r = new Rectangle2D.Double(x2,
baseBarras - altura,
larguraBarra,
altura);
g2.setColor(corDaBarra[count]);
g2.fill(r);
altura = (int) ((barra[count]
* alturaBarraMax) / 100);
g2.setColor(Color.white);
g2.drawString(KubicBigDecimal.getParteInteira(
theValor[count], 2)
+ "."
+
KubicBigDecimal.getParteCentavos(theValor[count],
2)
+ " ="
+ " "
+
KubicBigDecimal.getParteInteira(barra[count], 2)
+ "."
+
KubicBigDecimal.getParteCentavos(barra[count], 2)
+ "% ", x2,
baseBarras + 15);
}
}
g2.dispose();
}
else {
final Graphics2D g2 = (Graphics2D) graphics;
g2.dispose();
}
}
/**
* @param args
* the command line arguments
*/
public static void main(String[] args) {
Runnable doCreateAndShowGUI = new Runnable() {
public void run() {
createAndShowGUI();
}
};
SwingUtilities.invokeLater(doCreateAndShowGUI);
}
private static void createAndShowGUI() {
final String tituloChart = "KUBIC CHART";
JFrame f = new JFrame(tituloChart);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(800, 300);
/*
* KubicChartBean chartBean = new KubicChartBean();
* chartBean.setLabels(labels);
chartBean.setValor(valor);
* chartBean.setTitulo(tituloChart);
*/
// public AnimateBar(double [] valor, String []
labels, String title){
String tituloChart2 = "KUBIC CHART";
double[] valuesToChart = { 201.05, 33.22, 44.22,
100.22, 100.22,
100.00, 22.01 };
String[] labelToChart = { "SHELSON", "SHELSON",
"TESTE", "TESTE2", "TESTE3", "sss",
"sss" };
boolean animateChart = true;
KubicChartBean chartBean = new KubicChartBean();
chartBean.setLabels(labelToChart);
chartBean.setValor(valuesToChart);
chartBean.setTitulo(tituloChart);
chartBean.setAnimate(animateChart);
KubicSwingTagChartBarPanel animate = new
KubicSwingTagChartBarPanel(
chartBean);
int animateWidth = (labelToChart.length * 120) + 50;
int animateHeight = 300;
animate
.setPreferredSize(new
Dimension(animateWidth,
animateHeight - 50));
f.setVisible(true);
JScrollPane scroll = new JScrollPane(animate);
scroll.setPreferredSize(new Dimension(400,
animateHeight));
f.add(scroll);
animate.go();
}
public void repaint2() {
super.repaint();
}
public void go() {
if (task == null) {
task = new TimerTask() {
public void run() {
if (tamanho <= alturaBarraMax)
{
//
System.out.println("alturaBarraMax-" +
// alturaBarraMax);
//
System.out.println("tamanho-" + tamanho);
tamanho += 1.0;
repaint2();
} else {
}
}
};
Timer timer = new Timer();
timer.schedule(task, 0, DELAY);
}
}
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
}
}