2016-01-12 68 views
0

我想在RCP應用程序中創建一個標籤,該應用程序最初不可見。當我點擊保存按鈕時,它變得可見。同樣,它應該在5秒鐘內不可見。如何在Eclipse RCP應用程序中自動隱藏標籤5秒鐘?

爲此我寫了這以下代碼:

saveButton.addSelectionListener(new SelectionListener() { 

      @Override 
      public void widgetSelected(SelectionEvent e) { 
       // TODO Auto-generated method stub 
       System.out.println(textName.getText()); 
       String text = textName.getText(); 
       tree.getSelection()[0].setText(text); 
       String nodeId = ((TreeStructure) tree.getSelection()[0] 
         .getData()).getNodeId(); 
       // update the database 
       UpdateTree updateTree = new UpdateTree(); 
       updateTree.renameNode(text, nodeId); 
       label.setBounds(xForFirstButton, yIndexForButtons 
         + Constants.BUTTON_BUFFER, Constants.BUTTON_WIDTH, 
         Constants.BUTTON_HEIGHT); 
       label.setVisible(true); 

       AbstractAction myAction = new AbstractAction() { 

        private static final long serialVersionUID = 1L; 

        @Override 
        public void actionPerformed(ActionEvent arg0) { 
         // TODO Auto-generated method stub 
         label.setVisible(false); 
        } 
       }; 

       Timer myTimer = new Timer(5000, myAction); 
       myTimer.start(); 
      } 

但是,該代碼,一邊跑給這個以下錯誤:

Exception in thread "AWT-EventQueue-0" org.eclipse.swt.SWTException: Invalid thread access 
    at org.eclipse.swt.SWT.error(SWT.java:4441) 
    at org.eclipse.swt.SWT.error(SWT.java:4356) 
    at org.eclipse.swt.SWT.error(SWT.java:4327) 
    at org.eclipse.swt.widgets.Widget.error(Widget.java:476) 
    at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:367) 
    at org.eclipse.swt.widgets.Control.setVisible(Control.java:3781) 
    at com.app.editor.views.EditorView$2$1.actionPerformed(EditorView.java:183) 
    at javax.swing.Timer.fireActionPerformed(Unknown Source) 
    at javax.swing.Timer$DoPostEvent.run(Unknown Source) 
    at java.awt.event.InvocationEvent.dispatch(Unknown Source) 
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
    at java.awt.EventQueue.access$500(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue.dispatchEvent(Unknown Source) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.run(Unknown Source) 

可以請人指出是什麼問題?

在此先感謝!

回答

4

更改UI的所有代碼都必須在UI線程中運行 - Timer正在另一個線程中運行代碼。

而不是Timer使用:

Display.getDefault().timerExec(milliseconds, runnable); 
+0

哦..大...工作完全正常......非常感謝! –

+1

請注意,您將必須檢查您要隱藏的標籤是否尚未處理到可運行內。否則,你可能會導致一個小部件處置異常。 –

0

要更新您從一個線程是不是你就必須使用這個UI線程UI:

Display.getDefault().syncExec(new Runnable() { 
    public void run() { 
      // Update UI here 
    } 
}); 

syncExec將RCP應用程序的UI線程中執行你的行動。

這與Swing中的invokeLater()方法類似。

相關問題