2016-10-04 5 views
1

У меня есть несколько кнопок, которые при нажатии будут запускать скрипт и в случае успеха будут генерировать сообщение Passed/Failed, отображаемое в текстовом поле в графическом интерфейсе с помощью Swing. Я заметил, что текст для предыдущего результата все еще отображается даже после нажатия на новую кнопку для запуска скрипта. Этот текст отображается до завершения скрипта, генерируя новый результат, который затем отображается.Очистить текстовое поле при нажатии кнопки в Swing

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

Кнопка:

Test1 = new JButton("Test1"); 
    Test1.setLocation(290, 30); 
    Test1.setSize(120, 30); 
    Test1.addActionListener(this); 
    Test1.addMouseListener(new MouseAdapter() { 
     public void mouseClicked(java.awt.event.MouseEvent e) { 
      if (Test1.isEnabled()) { 
       errorLabel.setText(""); 
       result = JUnitCore.runClasses(Test1.class); 
       errorMessageDisplay(result); 
      } 
     } 
    }); 
    buttonPanel.add(Test1); 

Код сообщения об ошибке:

public void errorMessageDisplay(Result resultPass) { 
    errorLabel.addMouseListener(new MouseAdapter(){ 
     @Override 
     public void mouseClicked(MouseEvent e){ 
      errorLabel.setText(""); 
      errorLabel.setVisible(true); 
     } 
    }); 


    if (result.getFailureCount() > 0) { 
     errorLabel.setForeground(Color.red); 
     errorLabel.setVisible(true); 
     errorLabel.setText(" Failed"); 
    } 

    else { 
     errorLabel.setForeground(Color.green); 
     errorLabel.setText(" Passed"); 
     errorLabel.setVisible(true); 
    } 
} 
+0

Вам необходимо запустить свои тесты в другом потоке, вы блокируете поток gui (EDT). Кроме того, почему вы создаете слушателя каждый раз, когда вызывается ошибкаMessageDisplay? – matt

+0

Дело в том, что я хочу иметь возможность запускать только 1 тест за раз. Разве мне не нужно создавать нового лизена? –

+0

Я не знаю, почему вам нужен новый слушатель, похоже, что этот только очищает текст и устанавливает ярлык видимым. Он уже должен быть виден, если вы нажмете на него. Вы просто накапливаете слушателей, которые будут делать то же самое. – matt

ответ

0

Самое простое решение заключается в создании другой поток.

if (Test1.isEnabled()) { 
    errorLabel.setText(""); 
    new Thread(()->{ 
     Result result = JUnitCore.runClasses(Test1.class); 
     EventQueue.invokeLater(()->errorMessageDisplay(result)); 
    }).start(); 
} 

Это не очень хорошее решение, загляните в использовании SwingWorker или ExecutorService.

Примером использования службы-исполнителя может быть создание исполнителя при запуске.

ExecutorService service = Executors.newSingleThreadExecutor(); 

Затем отправьте задания на него.

if (Test1.isEnabled()) { 
    errorLabel.setText(""); 
    service.submit(()->{ 
     Result result = JUnitCore.runClasses(Test1.class); 
     EventQueue.invokeLater(()->errorMessageDisplay(result)); 
    }); 
} 

Это позволит вам представить более одного задания, но они будут запускаться серийно. Вы также можете контролировать поток задания через gui.

if (Test1.isEnabled()) { 
    test1.setEnabled(false); 
    errorLabel.setText(""); 
    service.submit(()->{ 
     Result result = JUnitCore.runClasses(Test1.class); 
     EventQueue.invokeLater(()->{ 
      errorMessageDisplay(result); 
      test1.setEnabled(true); 
     }); 
    }); 
} 
+0

Если я создаю другой поток, это означает, что вы можете параллельно запускать несколько тестов? –

+0

Да, вы могли бы запускать несколько вещей параллельно. Если это ваша цель, я бы определенно предложил заглянуть в сервис исполнителя. Таким образом, вы можете контролировать, как они выполняются лучше. – matt

+0

Я не могу управлять вещами параллельно, к сожалению hmmm –