#java #swing #user-interface
#java #swing #пользовательский интерфейс
Вопрос:
Я пытаюсь создать симуляцию игры в рулетку с использованием GUI / Swing для моего предстоящего экзамена. У меня есть два класса, один называется GUI и на самом деле является кодом, используемым для компонентов, таких как JFrame, JOptionPane, JButtons и т.д. Другой расширяет поток и должен отображать случайные числа на небольшой JLabel, а метод run выглядит примерно так:
public void run() {
int k = 0;
for (int i = 0; i < 50; i ) {
k = (new Random().nextInt(37));
label.setText(k " ");
label.setFont(new Font("Tahoma", Font.BOLD, 56));
label.setForeground(Color.yellow);
try {
sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
И в классе GUI я просто хочу ВЗЯТЬ число из последней итерации вышеупомянутого цикла, а затем передать его в новый int, который я собираюсь использовать позже в классе GUI.
Есть идеи?
Комментарии:
1. Используйте таймер Swing, как рекомендует @Braj (1 к его ответу). Кроме того, вы почти никогда не хотите расширять класс Thread . Если вам нужно было использовать базовые потоки и вы абсолютно не могли использовать Swing Timer или SwingWorker, тогда вы бы хотели, чтобы ваш класс реализовывал Runnable, а не extend Thread .
Ответ №1:
Используйте Swing Timer вместо Thread.sleep
этого, когда-нибудь зависает все приложение swing.
Пожалуйста, посмотрите, как использовать таймеры Swing
Timer timer = new Timer(50, new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
//next call from here
}
});
timer.setRepeats(false);
timer.start();
Я просто хочу ВЗЯТЬ число из последней итерации вышеупомянутого цикла, а затем передать его новому int, который я собираюсь использовать позже в классе GUI.
Просто создайте метод (установщик) в другом классе, который принимает int, и вызовите его из этого класса для последнего вызова.
Пример кода:
private int counter = 0;
private Timer timer;
...
final JLabel label = new JLabel();
label.setFont(new Font("Tahoma", Font.BOLD, 56));
label.setForeground(Color.yellow);
Thread thread = new Thread(new Runnable() {
public void run() {
timer = new Timer(50, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (counter < 50) {
int k = (new Random().nextInt(37));
label.setText(k " ");
} else {
timer.stop();
label.setText("next call");
}
}
});
timer.setRepeats(true);
timer.start();
}
});
thread.start();
снимок: