Пытаюсь создать с помощью swing интерфейс, пока безуспешно. Задача: по нажатию кнопки "Start" разблокировать поток InitAll при условии изменения переменной calculationIsActive,которая определена в классе GUI и изменяется при нажатии этой же кнопки, и после чего вызывается метод displayModelState(также определенный в GUI), который в цикле обновляет количество машин в очереди, выводя это в интерфейс. В main инициализирую интерфейс:
public class Main {
public static void main(String[] args) {
GUI GUI = new GUI();
GUI.setVisible(true);
InitAll initAll = new InitAll(GUI);
initAll.start();
}
}
Далее запускается новый поток, выглядящий так:
public class InitAll extends Thread{
ReentrantLock locker;
Condition condition;
GUI GUI;
public InitAll(GUI GUI) {
this.GUI = GUI;
locker = new ReentrantLock();
condition = locker.newCondition();
}
@Override
public void run() {
locker.lock();
try {
while (!(GUI.calculationIsActive)) {
condition.await();
}
condition.signalAll();
GUI.displayModelState();
} catch (InterruptedException exs) {
System.out.println("Some error occurred");
} finally {
locker.unlock();
}
}
}
Ну и сам класс графического интерфейса:
public class GUI extends JFrame {
/*Объявление некоторых элементов интерфейса*/
public volatile boolean calculationIsActive = false;
public void displayModelState() {
while(calculationIsActive) {
QueueSizeLabel.setText(CarQueue.queueSize + "");
}
}
public GUI() {
setContentPane(rootPanel);
setTitle("Gas station");
pack();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
threadManager = new ThreadManager();
stopButton.setEnabled(false);
startButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
calculationIsActive = true;
stopButton.setEnabled(true);
threadManager.startCalculations();
}
});
}
}
Мне казалось, что должно работать, но поток не выходит из ожидания при изменении calculationIsActive, сколько бы раз я кнопку "Start" не нажимал. Помогите, пожалуйста.
GUI.setVisible(true)
блокрует текуший поток до тех пор пока фрейм не будет закрыт.
Так что код
InitAll initAll = new InitAll(GUI);
initAll.start();
не выполняется.
Попробуйте перенестиего до setVisible
.
Виртуальный выделенный сервер (VDS) становится отличным выбором
При чти чтение базы даных MS Access получаю ошибку
Имеется некое оконное приложение написанное с помощью QtЕсть ли возможность встроить его в eclipse? Я знаю, что плагины для него можно писать...