Как реализовать поток внутри JFrame? По нажатию на кнопку создается новый JFrame, в котором рисуется график.
Поскольку встроенных графиков в Java.swing нету, то я использую библиотеку jCharts. Библиотека хорошая, но для корректного отображения в созданном фрэйме я запускаю поток, который периодически перерисовывает график.
При этом работает кнопка свернуть, а крестик не работает.
Из-за того, что поток засыпает постоянно, не прожимается еще и главный фрэйм, на котором кнопка создания фрэйма с графиком.
Как это обойти ?
Возможно есть событие перемещения окна, тогда я знаю как организовать и без потока фрэйм с графиком. Сейчас убрать поток невозиожно, тк необходима перерисовка.
UPD Иными словами, мне надо заставить поток, рисуйщий главный фрэйм, спать пока не закрыт фрэйм с графиком. frame = new JFrame();
frame.setSize( 600, 600 );
frame.setTitle(title);
frame.setResizable(false);
frame.setVisible( true );
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Thread T = new Thread (this);
init_components(type, xAxisLabels, xAxisTitle,
yAxisTitle, title, legendLabels, data);
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
T.run();
}
});
@Override
public void run() {
while (true) {
try {
repaint();
T.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace(System.out);
}
}
}

21 Авг 2019 в 07:06
168 +1
0
Ответы
1

Для решения проблемы с кнопкой свернуть и закрыть JFrame с графиком, вам нужно аккуратно управлять потоком отрисовки и завершением работы фрейма с графиком.

Один из способов - использовать флаг для указания, что фрейм с графиком закрыт. В вашем коде вы можете добавить такой флаг и связать его с событием закрытия фрейма с графиком:

boolean graphFrameClosed = false; // флаг для отслеживания закрытия фрейма с графиком
// Код для создания фрейма с графиком и запуска потока
...
@Override
public void run() {
while (!graphFrameClosed) {
try {
repaint();
T.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace(System.out);
}
}
}

А затем в обработчике закрытия фрейма с графиком устанавливать этот флаг в true:

frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
graphFrameClosed = true;
frame.dispose();
}
});

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

20 Апр 2024 в 13:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир