Java Swing, как я могу заставить этот счетчик работать? - PullRequest
3 голосов
/ 01 апреля 2011

Каждый раз, когда мой счетчик достигает 4, я хочу, чтобы он воспроизводил звуковой сигнал, возвращался к «1» и снова считал до 4, воспроизводил звуковой сигнал и т. Д.

Я, вероятно, не должен устанавливать этов ярлыке, потому что счетчик не работает вообще!Я не получаю никаких ошибок, но лейбл говорит;счетчик равен 4 и не считается или что-либо еще.

Можете ли вы помочь мне заставить этот счетчик работать должным образом?Я также использовал printline, но это также дало некоторые ошибки.

Мой код счетчика:

button1.addActionListener(new ActionListener() {

  public void actionPerformed(ActionEvent arg0) {

    label1.setVisible(true);
    int counter = 1;

    while(counter < 5 )
    {
      label1.setText("counter  is " + counter);
      counter = counter + 1 ;
    }

    counter = 1;
    tk.beep();
  }
});

Ответы [ 5 ]

5 голосов
/ 01 апреля 2011

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

Вы выполняете всю эту работу в потоке диспетчеризации событий, который является единственным потоком, который обновляет графический интерфейс. Поэтому, когда вы устанавливаете текст метки, он не обновляется на экране до тех пор, пока метод не вернется, а поток отправки событий обработает операцию перерисовки.

Для этого вам нужно создать новый поток, а не просто запустить его в цикле, который выполняется немедленно. Просто используйте метод actionPerformed, создающий новый Thread, который обрабатывает это вместо этого. Цикл, счет и обновление в этой теме, ожидая с Thread.sleep между обновлениями. Чтобы обновить текст метки, создайте новый Runnable, который обновит метку до следующего значения, и поместите его в поток обработки событий с помощью SwingUtilities.invokeLater. Держите этот поток в фоновом режиме, пока он вам не понадобится. Я бы порекомендовал проверять логическое состояние выключения при каждом прохождении цикла и выходить, когда для него установлено значение false. Таким образом, вы можете в любое время аккуратно закрыть поток. Или, если вы хотите, чтобы он выполнял обратный отсчет и издавал звуковой сигнал только один раз, вы можете завершить поток после одной итерации подсчета.

Есть много вопросов о переполнении стека, которые детализируют каждый из этих шагов, поэтому я не буду повторять эту информацию здесь.

1 голос
/ 01 апреля 2011

Если я правильно понимаю, что вы хотите, приведенный ниже код должен достичь вашей цели.

button1.addActionListener(new ActionListener() {

  public void actionPerformed(ActionEvent arg0) {

    label1.setVisible(true);

    Runnable runnable = new Runnable() {
           int counter =1 ;

           public void run() {
               while(true) {

                    while (counter<5)  {
                        SwingUtilties.invokeLater(new Runnable() {
                               public void run() {
                                   label1.setText("counter  is " + counter);
                               }
                        }); 

                        counter = counter + 1 ;
                        try {
                           Thread.sleep(1000);
                        }catch(InterruptedException ex) {
                            System.err.println(ex.toString());

                        }    
                    } 
                counter = 1;
                tk.beep();

                }

           }
    };

     new Thread(runnable).start();

});
1 голос
/ 01 апреля 2011

Может быть, это то, что вы намеревались, каждое 4-е нажатие кнопки сбрасывает и подает звуковой сигнал

loginButton.addActionListener(new java.awt.event.ActionListener() {

    int counter = 1;

    public void actionPerformed(ActionEvent arg0) {

        label1.setVisible(true);

        if (counter < 5) {
            label1.setText("counter  is " + counter);
            label1.repaint();
            ++counter;
        } else {
            counter = 1;
            tk.beep();
        }
    }
});
1 голос
/ 01 апреля 2011

После изменения значения нужно перекрасить.Кроме того, я предполагаю, что вы действительно хотите посчитать секунды, и в этом случае вам нужно использовать таймер, чтобы начать действие по смене метки и, возможно, воспроизвести звук.

0 голосов
/ 01 апреля 2011

Ваш цикл останавливается после первых 4 и никогда не вызывается снова. так как текст меняется быстро, вы можете видеть только последний результат

int counter = 0;
while (//when do you want it to stop?)
{
    // print what you want (using (counter % 4) + 1)
    if ((counter % 4) == 0)
    {
         tk.beep();
    }
}
...