Java GUI / Swing, остановка потока, передача целых чисел между классами

#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();
  

снимок:

введите описание изображения здесь