2016-10-24 15 views
0

У меня есть кнопка панели инструментов, которую я пытаюсь отключить, используя action.setEnabled (false), но когда я это делаю, я получаю следующую ошибку:Почему я не могу отключить кнопку панели инструментов (действие) с помощью setEnabled (false)

java.lang.IllegalStateException: This must happen in the event thread! 
    at org.openide.awt.Actions$Bridge.propertyChange(Actions.java:929) 
    at org.openide.util.WeakListenerImpl$PropertyChange.propertyChange(WeakListenerImpl.java:197) 
    at java.beans.PropertyChangeSupport.fire(PropertyChangeSupport.java:335) 
    at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:327) 
    at javax.swing.event.SwingPropertyChangeSupport.firePropertyChange(SwingPropertyChangeSupport.java:92) 
    at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:263) 
    at javax.swing.AbstractAction.firePropertyChange(AbstractAction.java:276) 
    at javax.swing.AbstractAction.setEnabled(AbstractAction.java:236) 

это происходит после вызова этого кода:

   Action a = new ActionsHelper().findAction("StopDataLogging"); 
       a.setEnabled(false); 

Но когда я делаю это внутри метода actionPerform он не показывает ошибку:

public void actionPerformed(ActionEvent e) { 
    // TODO implement action body 
     Action a = new ActionsHelper().findAction("StopDataLogging"); 
     if (a != null){ 
      if (a.isEnabled()){ 
       a.setEnabled(false); 
       this.setEnabled(true); 
      }else{ 
       a.setEnabled(true); 
       this.setEnabled(false); 
      } 
     } 

} 

Каким образом можно включить/отключить действие вне потока событий?

UPDATE:

Я даже создать свое собственное мероприятие действий, и я пытаюсь использовать setEnable в actionPerformed и не событие, как это работает, он замирает показывает ту же самую ошибку

    ActionEvent actionEvent = new ActionEvent(this, 
          ActionEvent.ACTION_PERFORMED, "DataLoggingCompleted"); 
        a.actionPerformed(actionEvent); 

.... .....

public void actionPerformed(ActionEvent e) { 
    // TODO implement action body 
    if(e.getActionCommand().contains("DataLoggingCompleted")){ 
     setEnabled(false); 
    } 
} 
+0

Возможный дубликат [Получение java.lang.IllegalStateException: этот вызов должен произойти в AWT Event Dispatch Thread! См.] (Http://stackoverflow.com/questions/12464524/getting-java-lang-illegalstateexception-this-call-must-happen-in-the-awt-event) – talex

+0

Это не дубликат, мой случай когда действие включено/отключено с помощью «action.setEnabled (state)». Другая связана с инициализацией GUI –

ответ

0

Я не уверен, но, возможно, решение сделать setEnabled метод синхронизируется

+0

Спасибо за предложение, купить синхронизированный метод не получилось –

+0

@CamiloGuevara Я не был уверен, но, возможно, стоит попробовать – Lucurious