如果条件仍然有效,如何在单独的线程中延迟 运行 方法
How to run method with delay in separate thread if condition is still valid
我需要一些帮助,谢谢。我需要 运行 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...
}
感谢任何提示!!!
在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 秒到期之前关闭的对话框。
我需要一些帮助,谢谢。我需要 运行 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...
}
感谢任何提示!!!
在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 秒到期之前关闭的对话框。