Как реализовать поток внутри 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
142 +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 Апр в 13:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 84 683 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир