Gráfico de Linhas não desenha as linhas de acordo com os valores [JAVA]

0 respostas
java
M

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);
    }
}
Criado 19 de novembro de 2019
Respostas 0
Participantes 1