Eu estou fazendo um trabalho que consiste em pegar os valores no banco de dados e montar um gráfico de barras e linhas com esses valores usando o paintComponent do pacote java.awt.Graphics . O gráfico de barras eu consegui fazer quase perfeitamente, mas no gráfico de linhas, as linhas não são desenhadas corretamente, como mostra a imagem abaixo:
Eu quero que as linhas fique como na imagem abaixo(linhas desenhadas no Gimp ):
Os valores desse gráfico são:
2019: Janeiro - 10000, Fevereiro - 20000, Março - 30000.
2018: Janeiro - 40000, Fevereiro - 50000, Março - 60000.
Quem puder me ajudar eu agradeço.
Segue o código onde eu desenho os gráficos:
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JPanel;
public class DesenhaGrafico extends JPanel {
private static final long serialVersionUID = 1L;
private int larguraColuna = 30;
private int margem = 20;
private int altura;
private int quantidadeLinhas = 6;
private int espaco = 20;
private String[] rotulos;
private List<int[]> valores = new ArrayList<int[]>();
private List<Color> cores = new ArrayList<Color>();
private List<String> legendas = new ArrayList<String>();
private int tipoGrafico;
private String tituloGrafico;
private String tituloVertical;
public void setRotulos(String[] rotulo) {
this.rotulos = rotulo;
}
public void setTitulos(String tituloGrafico, String tituloVer) {
this.tituloGrafico = tituloGrafico;
this.tituloVertical = tituloVer;
}
public void setDados(String titulo, int[] dados, Color cor) {
legendas.add(titulo);
cores.add(cor);
valores.add(dados);
}
public void setTipoGrafico(int indice) {
tipoGrafico = indice;
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
// Renderiza o Gráfico.
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
setSize(1000, 500);
altura = getHeight();
/*
* Acha o maior valor e armazena o mesmo.
*/
int max = Integer.MIN_VALUE;
for (int j = 0; j < valores.size(); j++) {
int[] dados = valores.get(j);
for (Integer value : dados) {
max = Math.max(max, value);
}
}
/*
* Desenha linhas do Gráfico
*/
int contador = max;
int x_linhaHorizontal = rotulos.length * espaco * 2 + larguraColuna
+ (valores.size() * larguraColuna) * rotulos.length + 40 - 5; // comprimento da linha
g2.setColor(Color.BLACK);
// desenha linha vertical
g2.drawLine(40 + 15, 40, 40 + 15, altura - 59);
// desenha linhas horizontais
for (int i = 0; i <= quantidadeLinhas; i++) {
int y_linhaHorizontal = 40 + i * ((altura - 98) / quantidadeLinhas);
// desenha linha
g2.drawLine(40 + 15, y_linhaHorizontal, x_linhaHorizontal, y_linhaHorizontal);
// desenha numeros
g2.drawString("" + contador, 30, y_linhaHorizontal);
contador -= (max / quantidadeLinhas);
}
/*
* Desenha os rotulos do Gráfico.
*/
for (int i = 0; i < rotulos.length; i++) {
String rotulo = rotulos[i];
g2.setColor(Color.BLACK);
// desenha rotulos
g2.drawString(rotulo, i * espaco * 2 + larguraColuna + (valores.size() * larguraColuna) * i + 40,
altura - 41);
}
/*
* Desenha as series do Gráfico.
*/
for (int j = 0; j < valores.size(); j++) {
g2.setColor(Color.BLACK);
// escreve legenda
g2.drawString(legendas.get(j), rotulos.length * espaco * 2 + larguraColuna
+ (valores.size() * larguraColuna) * rotulos.length + 40 + 15, 40 + j * 15 + 7);
g2.setColor(cores.get(j));
g2.fillRect(rotulos.length * espaco * 2 + larguraColuna + (valores.size() * larguraColuna) * rotulos.length
+ 40 + 5, 40 + j * 15, 7, 7);
}
/*
* Desenha os dados o grafico de linha ou de barras de acordo com o valor da
* variavel tipografico.
*/
setBackground(Color.WHITE);
for (int i = 0; i < rotulos.length; i++) {
for (int j = 0; j < valores.size(); j++) {
int dado = valores.get(j)[i];
// faz o grafico ficar "responsivel" para o tamanho da janela definido
int height = (int) ((altura - 40) * ((double) dado / max));
// seta cor da coluna ou linha
g2.setColor(cores.get(j));
// desenha grafico de barras
if (tipoGrafico == 0) {
g2.fillRect((i * espaco * 2 + (j + 1) * larguraColuna + (valores.size() * larguraColuna) * i + 40),
altura - height, larguraColuna, height - 58);
} else {
// desenha grafico de linhas
if (i > 0) {
g2.drawLine(i * espaco + (valores.size() * larguraColuna) * i + 40, (altura + 40) - dado,
(i + 1) * espaco + (valores.size() * larguraColuna) * (i + 1) + 40,
(altura + 40) - dado);
}
// desenha marcadores na linha
g2.fillOval((i + 1) * espaco + valores.size() * larguraColuna + (valores.size() * larguraColuna) * i
+ 40 - 3, (altura + 40) - height - 40, 7, 7);
}
}
}
// Desenha o titulo principal do Gráfico
g2.setColor(Color.BLACK);
g2.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 14));
g2.drawString(tituloGrafico, margem * 10, margem / 2);
// Desenha o nome do Eixo Y do Gráfico.
g2.setColor(Color.BLACK);
g2.rotate(Math.PI / -2.0);
g2.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 16));
g2.drawString(tituloVertical, -5 - altura / 2, 20);
}
}

