2013-07-08 4 views
0

У меня есть массив из 100 000 образцов всех двойных типов. Я хочу отобразить или построить этот массив, чтобы получить движущуюся диаграмму/график (динамический), а не отображать его сразу. Может кто-нибудь мне помочь. На графике ee [] и y [] получается после некоторой обработки.Динамическая диаграмма с использованием JFreeChart

private byte[] FileR(String filename) { 
    byte[] data = null; 
    AudioInputStream ais; 
    try { 
     File fileIn = new File(filename); 
     if (fileIn.exists()) { 
      ais = AudioSystem.getAudioInputStream(fileIn); 
      data = new byte[ais.available()]; 
      ais.read(data); 
     } 
    } catch (UnsupportedAudioFileException | IOException e) { 
     System.out.println(e.getMessage()); 
     throw new RuntimeException("Could not read " + filename); 
    } 
    return data; 
} 

private byte[] Capture(double t) throws LineUnavailableException { 
    AudioFormat format = new AudioFormat(48000, 16, 2, true, false); 
    DataLine.Info info = new DataLine.Info(TargetDataLine.class, format); 
    line = (TargetDataLine) AudioSystem.getLine(info); 
    line.open(format); 
    line.open(); 
    int size = (int) (line.getBufferSize() * t); 
    byte[] b = new byte[size]; 
    line.start(); 
    line.read(b, 0, size); 
    return b; 
} 

private void plot(double[] ee, double[] y) { 
    XYSeries see = new XYSeries("Filtered"); 
    for (int i = 0; i < ee.length; i++) { 
     see.add(i, ee[i]); 
    } 
    XYSeriesCollection cee = new XYSeriesCollection(); 
    cee.addSeries(see); 
    XYItemRenderer ree = new StandardXYItemRenderer(); 
    NumberAxis rangeAxisee = new NumberAxis("Filtered"); 
    XYPlot subplot1 = new XYPlot(cee, null, rangeAxisee, ree); 
    subplot1.setRangeAxisLocation(AxisLocation.BOTTOM_OR_LEFT); 
    XYSeries sy = new XYSeries("Noisy"); 
    for (int i = 0; i < y.length; i++) { 
     sy.add(i, y[i]); 
    } 
    XYSeriesCollection cy = new XYSeriesCollection(); 
    cy.addSeries(sy); 
    XYItemRenderer ry = new StandardXYItemRenderer(); 
    NumberAxis rangeAxisy = new NumberAxis("Noisy"); 
    XYPlot subplot2 = new XYPlot(cy, null, rangeAxisy, ry); 
    subplot2.setRangeAxisLocation(AxisLocation.BOTTOM_OR_LEFT); 
    CombinedDomainXYPlot plot = new CombinedDomainXYPlot(new NumberAxis("Domain")); 
    plot.setGap(10.0); 
    plot.add(subplot1); 
    plot.add(subplot2); 
    plot.setOrientation(PlotOrientation.VERTICAL); 
    JFreeChart chart = new JFreeChart("Adaptive Filter", JFreeChart.DEFAULT_TITLE_FONT, plot, true); 
    panel = new ChartPanel(chart, true, true, true, false, true); 
    JFrame frame = new JFrame(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(750, 500); 
    frame.add(panel, BorderLayout.CENTER); 
    frame.setVisible(true); 
} 
+0

Что вы имеете в виду? Вы имеете в виду, что он меняется во время выполнения? анимация? –

+0

Возможно, вы ищете один из предложенных подходов [здесь] (http://stackoverflow.com/q/5048852/230513). – trashgod

+0

Оливер Уоткинс, возможно, у вас есть мой вопрос. Можете ли вы мне помочь. –

ответ

0

Вы должны иметь нить где все это данные поступают из. Например, из вашего бэкэнда. Затем каждый раз, когда появляется новый набор данных для диаграммы, вам необходимо обновить диаграмму с помощью Event Dispatch Thread. Если ваши данные диаграммы поступают через регулярные промежутки времени, это довольно просто (т. Е. Pull), однако, если это толчок (то есть данные более случайные), и может стать немного более сложным.

Удалить все создание GUI из метода участка:

JFreeChart chart = new JFreeChart("Adaptive Filter", JFreeChart.DEFAULT_TITLE_FONT, plot, true); 
panel = new ChartPanel(chart, true, true, true, false, true); 
JFrame frame = new JFrame(); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
frame.setSize(750, 500); 
frame.add(panel, BorderLayout.CENTER); 
frame.setVisible(true); 

Это нужно только назвать один раз. График будет вызываться каждый раз, когда появятся новые данные.

Вот простой подход:

public void startCharting() { 

    final MySoundCard card = new MySoundCard(); 
    final MyJFreeChart chart = new MyJFreeChart(); 

    Runnable r = new Runnable() { 

     @Override 
     public void run() { 
      while(true) { 

       int[] i = card.FileR(); 


       SwingUtilities.invokeLater(new Runnable() { 

        @Override 
        public void run() { 

         chart.plot(); 
        } 

       }); 


       try { 
        Thread.sleep(1000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 

      } 
     } 
    }; 

    Thread t = new Thread(r); 
    t.start(); 
} 

поток вызывает ваш DataSource каждый второй, а затем обновляет таблицу. Обновления вызывают в Thread Dispatch Thread.

+0

Данные (массив образцов), полученные из аудиофайла или записанные с звуковой карты. Теперь я хочу отобразить этот движок (динамический - не во временных рядах) вместо отображения за один раз. Если возможно, поясните пожалуйста. –

+0

Во-первых, как ваши данные поступают в ваше приложение. Вы называете метод? Или данные захватываются каким-то образом в вашем приложении? –

+0

@AbdulBaseerBuriro Я добавил код, который должен дать вам представление. –

Смежные вопросы