Как вызвать динамический график JChart2D, используя другой JFrame

#java #charts #real-time #jframe

#java #Диаграммы #в режиме реального времени #jframe

Вопрос:

Я использую JChart2D (http://jchart2d.sourceforge.net/index.shtml ) для динамического отслеживания значений двойного массива. когда я кодирую конфигурацию в основном методе и запускаю ее, она выполняется идеально.

введите описание изображения здесь

Вот код.

 public  class WaveTracer {

    ITrace2D trace ;
    Chart2D chart ;
    double dataArray [];
    JFrame frame;

public WaveTracer(int limit , double [] data){

trace = new Trace2DLtd(limit);

    dataArray = data;

}

public void configure(String framename, int fwidth , int fheight, int xpos , int ypos ){
    try{

    chart = new Chart2D();

    trace.setColor(Color.RED);

    frame = new JFrame(framename);

    frame.addWindowListener(new WindowAdapter() {
        /**
         * @see java.awt.event.WindowAdapter#windowClosing(java.awt.event.WindowEvent)
         */

        @Override

        public void windowClosing(final WindowEvent e) {

          System.exit(0);

        }

      });

      frame.getContentPane().add(chart);

      frame.setSize(fwidth, fheight);

      frame.setLocation(xpos, ypos);

    }catch (Throwable f) {
      System.exit(0);
    }
}

public void trace(int speed) throws InterruptedException{

    frame.setVisible(true);

    chart.addTrace(trace);

        for (int j = 0; j < dataArray.length; j  ) {

          trace.addPoint(j,dataArray[j]);

          Thread.sleep(speed);

         }

    System.exit(0);

}

public static void main(String args []){

      Random random = new Random();

    double d[] = new double[2000];

    int count=1;

    for(int i=200;i>=0;i--){

      d[200-i] = random.nextDouble()*10.0;

    }

         WaveTracer wavetracer = new WaveTracer(5000, d);

         wavetracer.configure("plying wave form with time", 1000, 500, 200, 200);

        try {

            wavetracer.trace(150);

        } catch (InterruptedException ex) {

            Logger.getLogger(FrequencyDitectorForm.class.getName()).log(Level.SEVERE, null, ex);
        }

}

}
  

Но мне нужно нарисовать график, когда я нажимаю на кнопку «Нарисовать», которая находится в другой форме. Я создал форму, которая содержит кнопку «Рисовать», и добавил следующий код к нажатию на действие.

  JFrame dialog = new JFrame();

 Random random = new Random();

    double d[] = new double[2000];

    int count=1;

    for(int i=200;i>=0;i--){

      d[200-i] = random.nextDouble()*10.0;

    }

WaveTracer wavetracer = new WaveTracer(5000, d);

         wavetracer.configure("plying wave form with time", 1000, 500, 200, 200);

        try {

            wavetracer.trace(150);
        } catch (InterruptedException ex) {
            Logger.getLogger(FrequencyDitectorForm.class.getName()).log(Level.SEVERE, null, ex);
        } 
  

введите описание изображения здесь

Но когда я нажимаю на эту кнопку, загружается только новый фрейм, и в нем ничего не отображается. Затем я протестировал цикл, добавив в цикл поле messagebox. В этом случае он показывает график для каждой итерации цикла.

введите описание изображения здесь

Может ли кто-нибудь, пожалуйста, помочь мне в этом вопросе. Как я могу нарисовать этот график из отдельной формы, не вызывая messagebox в каждом цикле цикла.

Ответ №1:

Вы вызываете Thread.sleep (…) в потоке отправки событий или EDT, главном потоке Swing, который отвечает за рисование и взаимодействие с пользователем, и, таким образом, переводите весь ваш графический интерфейс в спящий режим. Не делайте этого, а вместо этого используйте таймер переключения или фоновый поток.

Кроме того, просто вопрос дизайна: вы уверены, что хотите отобразить это в отдельном JFrame, а не в JPanel, или если вам нужно отдельное окно, JDialog? И вы уверены, что хотите вызвать System.exit(0) из класса построения графиков?

Комментарии:

1. Привет, судно на воздушной подушке, спасибо за совет. Я изменил его на таймеры, а затем удалил их system.exit (0) своим кодом. Теперь это работает нормально. Затем я заменил JFrame на JDialog. Теперь это работает нормально. 🙂

2. @Thilanka: рад, что это помогает, но вы снова можете захотеть принять мой ответ тогда и другие ответы в ваших предыдущих темах.

Ответ №2:

используете ли вы последнюю версию 3.2.1 jchart2d? Я исправил взаимоблокировку, связанную с некоторым «блокированием дерева». Если это так, мне пришлось присмотреться повнимательнее. Тогда я бы порекомендовал вам отправить ошибку вместе с вашим кодом.

с уважением, Ахим