#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? Я исправил взаимоблокировку, связанную с некоторым «блокированием дерева». Если это так, мне пришлось присмотреться повнимательнее. Тогда я бы порекомендовал вам отправить ошибку вместе с вашим кодом.
с уважением, Ахим