[RESOLVIDO] Criar um gráfico para cálculo de octetos

9 respostas Resolvido
P

olá, estou tentando criar um gráfico dinâmico onde o mesmo fica atualizando de acordo recebe os dados de um dispositivo por meio do SNMP, consegui fazer o gráfico aparecer, porém ele só aparece no final da execução do código, sei que tem que ser por thread, mas não estou sabendo onde coloco o código, alguém saberia me ajudar?
Quero que rode o código quando eu clico no botão iniciar e parar quando clicar no botão parar:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        CategoryDataset dados = createDataset(jTextFieldIP.getText(),jTextFieldOIDIn.getText(),jTextFieldOIDOut.getText());
        String titulo = "";
        String eixoy = "bps";
        String txt_legenda = "(t)";
        boolean legenda = false;
        boolean tooltips = false;
        boolean urls = false;
        
//        retornaDadoss("192.168.1.69", "1.3.6.1.2.1.31.1.1.1.6.3", "1.3.6.1.2.1.31.1.1.1.10.3");
        JFreeChart graf = ChartFactory.createLineChart(titulo, txt_legenda, eixoy, dados, PlotOrientation.VERTICAL, legenda, tooltips, urls);
        ChartPanel myChartPanel = new ChartPanel(graf, true);
        myChartPanel.setSize(jPanel1.getWidth(),jPanel1.getHeight());
        myChartPanel.setVisible(true);
                
        jPanel1.removeAll();
        jPanel1.add(myChartPanel);
        jPanel1.revalidate();
        jPanel1.repaint();
        
    }                        

private CategoryDataset createDataset(String IP, String OIDin, String OIDout) {
        String bytesin1, bytesout1, bytesin2, bytesout2;
        Bytes teste1=new Bytes();
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
        int i=0;
        try{
            while(i<20){
        bytesin1 = teste1.Bytes(IP,OIDin);
        bytesout1 = teste1.Bytes(IP, OIDout);
        
        TimeUnit.SECONDS.sleep(1);
        
        bytesin2 = teste1.Bytes(IP, OIDin);
        bytesout2 = teste1.Bytes(IP, OIDout);
        System.out.println("Downlo: "+((Float.parseFloat(bytesout2)-Float.parseFloat(bytesout1))*8)+"B/s");
        System.out.println("Upload: "+((Float.parseFloat(bytesin2)-Float.parseFloat(bytesin1))*8)+"B/s");
       
        dataset.addValue(((Float.parseFloat(bytesin2)-Float.parseFloat(bytesin1))*8),"Download",Integer.toString(i));
        dataset.addValue(((Float.parseFloat(bytesout2)-Float.parseFloat(bytesout1))*8),"Upload",Integer.toString(i));
        i++;
            }
        }catch(Exception e){
            System.out.println(e);
        }
            return dataset;
    }

9 Respostas

R

Boa noite, manda só a parte que você executa o código, não a classe toda. E quando for enviar um código, seleciona ele e clica em </>

P

Boa noite, é que sou novato aqui e nunca utilizei fórum para tirar dúvidas, mas também porque nunca precisei, mas nesse caso, é caso de urgência.
Obrigado.

R

não pode usar Thread?? Vc tem que deixar a execução em segundo plano e mostrar o gráfico na thread principal:

EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
              //código aqui
            }
        });
P

Desculpa, foi na hora de digitar, acabou entrando uma letra errada, eu queria dizer que sei que tem que ser por Thread, mas o problema é que eu não estou muito familiarizado com o uso de Thread e por isso estou meio perdido onde eu iria colocar o quê, quando executo o programa ele faz tudo certinho, mas o gráfico só aparece no final da execução e o programa para, não fica executando direto até eu clicar no botão para parar, obrigado novamente.

P

tentei fazer umas mudanças, mas sem sucesso, claramente não sei o que estou fazendo:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
            
            retornaDadoss();
            
        } 

private void retornaDadoss(){
        EventQueue.invokeLater(new Runnable() {
            
            @Override
            public void run() {
        
        
            
            CategoryDataset dados = createDataset(jTextFieldIP.getText(),jTextFieldOIDIn.getText(),jTextFieldOIDOut.getText());
            String titulo = "";
            String eixoy = "bps";
            String txt_legenda = "(t)";
            boolean legenda = true;
            boolean tooltips = true;
            boolean urls = true;
        
//        retornaDadoss("192.168.1.69", "1.3.6.1.2.1.31.1.1.1.6.3", "1.3.6.1.2.1.31.1.1.1.10.3");
            JFreeChart graf = ChartFactory.createLineChart(titulo, txt_legenda, eixoy, dados, PlotOrientation.VERTICAL, legenda, tooltips, urls);
            ChartPanel myChartPanel = new ChartPanel(graf, true);
            myChartPanel.setSize(jPanel1.getWidth(),jPanel1.getHeight());
            myChartPanel.setVisible(true);
            
            jPanel1.removeAll();
            jPanel1.add(myChartPanel);
            jPanel1.revalidate();
            jPanel1.repaint();
            
       
        }
        });
    }

private CategoryDataset createDataset(String IP, String OIDin, String OIDout) {
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
        String bytesin1, bytesout1, bytesin2, bytesout2;
        Bytes teste1=new Bytes();
        
        int i=0;
        try{
            for(int j=0;j<2;j++){
        bytesin1 = teste1.Bytes(IP,OIDin);
        bytesout1 = teste1.Bytes(IP, OIDout);
        
        TimeUnit.SECONDS.sleep(1);
        
        bytesin2 = teste1.Bytes(IP, OIDin);
        bytesout2 = teste1.Bytes(IP, OIDout);
        System.out.println("Downlo: "+((Float.parseFloat(bytesout2)-Float.parseFloat(bytesout1))*8)+"B/s");
        System.out.println("Upload: "+((Float.parseFloat(bytesin2)-Float.parseFloat(bytesin1))*8)+"B/s");
       
        dataset.addValue(((Float.parseFloat(bytesin2)-Float.parseFloat(bytesin1))*8),"Download",Integer.toString(i));
        dataset.addValue(((Float.parseFloat(bytesout2)-Float.parseFloat(bytesout1))*8),"Upload",Integer.toString(i));
        i++;
            }
        }catch(Exception e){
            System.out.println(e);
        }
            }
        });
        
            return dataset;
    }
R
Solucao aceita
private void retornaDadoss() {
    EventQueue.invokeLater(() -> {
        CategoryDataset dados = createDataset(jTextFieldIP.getText(), jTextFieldOIDIn.getText(), jTextFieldOIDOut.getText());
        String titulo = "";
        String eixoy = "bps";
        String txt_legenda = "(t)";
        boolean legenda = true;
        boolean tooltips = true;
        boolean urls = true;

//        retornaDadoss("192.168.1.69", "1.3.6.1.2.1.31.1.1.1.6.3", "1.3.6.1.2.1.31.1.1.1.10.3");
        JFreeChart graf = ChartFactory.createLineChart(titulo, txt_legenda, eixoy, dados, PlotOrientation.VERTICAL, legenda, tooltips, urls);
        ChartPanel myChartPanel = new ChartPanel(graf, true);
        myChartPanel.setSize(jPanel1.getWidth(), jPanel1.getHeight());
        myChartPanel.setVisible(true);

        jPanel1.removeAll();
        jPanel1.add(myChartPanel);
        jPanel1.revalidate();
        jPanel1.repaint();
    });
}
P

Cara obrigado novamente, porém acho que eu entendi errado o conceito da Thread, eu pensei que ela ficaria executando como um laço quando eu clicasse em iniciar e só parasse quando clicasse em parar, mas não, o código só captura duas entradas, acho que por conta do for que eu fiz pra ser de 2 em 2 e depois para, o gráfico não fica atualizando até eu clicar em parar!!!

R

Pense na Thread como se fosse algo pra deixar a coisa mais pesada em segundo plano. Nesse caso vc precisa da Thread e de um laço de repetição.

vc pode fazer uma condição pra isso:

(basicamente o código abaixo é:

CLICOU UMA VEZ: inicia a operação,
CLICOU OUTRA VEZ: finaliza a operação


boolean click = false;

if(!click){ //se click == false
   //chama o gráfico
   //e faz o laço de repetição pra ficar atualizando:
   
   while(!click){ //enquanto click for falso
        System.out.println("a");
    }
   click = true;
} else { //se click == true
  //para a atualização dele

  //código pra parar
   click = false;
}
P

cara obrigado por suas dicas, consegui resolver com Thread mesmo, agora está rodando perfeitamente:

Criado 20 de novembro de 2019
Ultima resposta 21 de nov. de 2019
Respostas 9
Participantes 2