странная ошибка - как приостановить Java-программу? - PullRequest
2 голосов
/ 24 марта 2012

Я пытаюсь:

  1. отобразить текст в jLabel,
  2. подождать две секунды,
  3. затем написать новый текст в jLabel

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


private void testButtonActionPerformed(java.awt.event.ActionEvent evt) {    
    displayLabel.setText("Clicked!");

    //  first method with System timer

    /*
    long t0=  System.currentTimeMillis();
    long t1=  System.currentTimeMillis();
            do{
                t1 = System.currentTimeMillis();
            }
            while ((t1 - t0) < (2000));
     */    

    // second method with thread.sleep()

    try {
        Thread.currentThread().sleep(2000);
    } catch (InterruptedException e) {}

    displayLabel.setText("STOP"); 
}

с этим кодом, текст «Нажал!»никогда не отображается.Я просто получаю 2 секунды - пауза и затем текст «STOP».Я пытался использовать системный таймер с циклом или Thread.sleep (), но оба метода дают одинаковый результат.

Ответы [ 3 ]

2 голосов
/ 24 марта 2012

Вот работающий пример, который делает то, что вы ищете.Как отмечается в комментарии Эндрю Томпсона, SwingWorker - хороший способ решения этой проблемы.

Основной принцип - никогда не блокировать поток обработки событий.Это поток, отвечающий за перерисовку графического интерфейса и реагирование на взаимодействие с пользователем, поэтому, если вы сделаете что-то вычислительно дорогостоящее с EDT, ваш графический интерфейс перестанет отвечать.

2 голосов
/ 24 марта 2012

Вы возитесь с веткой диспетчера событий.Это приведет к непредвиденному поведению пользовательского интерфейса, как вы видите.Если вы планируете делать анимации такого типа, обязательно прочитайте то, что предложил @Andrew Thompson, а также посмотрите, можете ли вы прочитать это - Грязные клиенты

Лучше использоватьSwing Timer, как показано в примере curde-ниже: ( да, это грубо, я не беспокоился об остановке таймера и т.д. ):

public class DelayTest  extends JPanel{
    JLabel messageLabel = new JLabel();
    JButton actionButton = new JButton("Click Me");
    String[] messages = {"Clicked", "Stop!"};
    int i=0;
    public DelayTest(){
        super();
        add(messageLabel);
        add(actionButton);
        actionButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                Timer timer = new Timer(1000, new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent arg0) {
                        if(i<=1)
                            messageLabel.setText(messages[i++]);
                    }
                });
                timer.start();

            }

        });
    }

}

Редактировать
Почему бы не остановить таймер:

           @Override
           public void actionPerformed(ActionEvent evt) {
              if (i <= 1) {
                 messageLabel.setText(messages[i++]);
              } else {
                 ((Timer)evt.getSource()).stop();
              }
           }
        });
2 голосов
/ 24 марта 2012

Просто, чтобы предоставить дополнительную информацию о комментарии Эндрю Томпсона: EDT отвечает за обработку обновлений графического интерфейса.Если вы заблокируете его с помощью Thread.sleep(...), эти обновления также будут заблокированы.Вот почему вы не видите первый текст - EDT просто не может выполнить обновление на этикетке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...