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

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

enter image description here

Вот код.

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);
        } 

enter image description here

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

enter image description here

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

Ответы [ 2 ]

1 голос
/ 30 апреля 2011

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

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

1 голос
/ 30 апреля 2011

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

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

...