【问题标题】:How to run method with delay in separate thread if condition is still valid如果条件仍然有效,如何在单独的线程中延迟运行方法
【发布时间】:2021-12-16 20:02:28
【问题描述】:

我需要一些帮助,拜托。我需要在单独的线程中运行 showErrorMessage(errorMessage) 并有一些延迟(2 秒)。但是如果用户在showErrorMessage 方法运行之前继续输入和result==true,我需要停止执行它。

private class DirectoryVarFieldEditor extends DirectoryFieldEditor
{
    /**
     * Initial path for the Browse dialog.
     */
    private File filterPath = null;
    
    public DirectoryVarFieldEditor(String name, String labelText, Composite parent) {
      //super( name, labelText, parent );
      init(name, labelText);
      setErrorMessage(JFaceResources.getString("DirectoryFieldEditor.errorMessage"));
      setChangeButtonText(JFaceResources.getString("openBrowse"));
      setValidateStrategy(VALIDATE_ON_KEY_STROKE);
      createControl(parent);
      setEmptyStringAllowed(false);
    }
    
    // another code...
    
    @Override
    protected boolean doCheckState() {
      System.out.println("DirectoryVarFieldEditor.doCheckState()");
      String fileName = getTextControl().getText();
      fileName = fileName.trim();
      fileName = TCA3DNKernel.expandEnvironmentVariables(fileName);
      if (fileName.length() == 0 && isEmptyStringAllowed()) 
        return true;
      File file = new File(fileName);
      return file.isDirectory();
    }
    
    //
    @Override
    protected boolean checkState()
    {
      boolean result = false;
      boolean emptyStringAllowed = super.isEmptyStringAllowed();
      Text textField = super.getTextControl();
      String errorMessage = getErrorMessage();
      if (emptyStringAllowed)
      {
        result = true;
      }
    
      if (textField == null)
      {
        result = false;
      } else
      {
        String txt = textField.getText();
        result = (txt.trim().length() > 0) || emptyStringAllowed;
      }
    
      // call hook for subclasses
      result = result && doCheckState();
    
      if (result)
      {
        clearErrorMessage();
      } else
      {
        System.out.println("DirectoryVarFieldEditor.checkState()");
        // showErrorMessage method shoud run with delay:
        showErrorMessage(errorMessage);
      }
      return result;
    }
    
    // another code...

}

感谢任何提示!!!

【问题讨论】:

    标签: java multithreading eclipse swt jface


    【解决方案1】:

    在 SWT/JFace 中,您不能在后台线程上调用 GUI 操作(这在大多数 GUI 系统中都是一样的)。

    为此,我将使用Display.timerExec 在两秒后运行一个方法。如果用户键入该方法可以检查的内容,则设置一个标志。 timerExec 在 UI 线程中运行代码,因此后台线程没有问题。

    private boolean dataEntered;
    
    ...
    
    dataEntered = false;
    
    Display.getCurrent().timerExec(2_000, () -> {
      if (!dataEntered && !getTextControl().isDisposed()) {
         showErrorMessage("xxx");
      }
    });
    
    ... other code sets dataEntered = true if data is entered
    

    !getTextControl().isDisposed() 检查处理在 2 秒到期之前关闭的对话框。

    【讨论】:

      猜你喜欢
      • 2012-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-19
      • 2015-01-24
      • 1970-01-01
      相关资源
      最近更新 更多