在Eclipse RAP中如何将push/force当前UI状态发送给客户端?
In Eclipse RAP how to push/force current UI state to the client?
我正在使用 Eclipse RAP 并有以下用例:
- 在
Text
字段中输入搜索文本并开始搜索
- 将
Label
文本更改为 "searching...."
- 进行实际搜索(异步)并在
Table
中显示结果
问题,即使在实际搜索开始之前标签应该更改为"searching....",但它更改为"searching...."搜索完成后。
我正在寻找的是一种在标签更改后,在搜索之前 push/force/update 向客户端发送当前 UI 状态的方法:
- 在
Text
字段中输入搜索文本并开始搜索
- 将
Label
文本更改为 "searching...."
- 将当前UI状态推送给客户端
- 进行实际搜索(异步)并在
Table
中显示结果
这里有一些示例代码:
Label statusLabel = new Label(parent, SWT.NONE);
Text searchText = new Text(parent, SWT.SEARCH);
searchText.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetDefaultSelected(SelectionEvent e) {
// change label
statusLabel.setText("searching...");
// HERE force client update
// start searching
Display.getCurrent().asyncExec(new Runnable() {
@Override
public void run() {
// do actual search
}
});
}
});
asyncExec
仍然 运行 是 UI 线程中的代码,它只是稍微延迟它直到下一次调用 Display.readAndDispatch
。所以您的搜索代码仍然会阻塞并且不允许标签更新。
您实际上需要 运行 在单独的线程中进行搜索。
asyncExec
旨在在可能的情况下在后台线程中使用 运行 UI 线程中的少量代码。 (您需要在后台线程中使用 Display.getDefault()
而不是 Display.getCurrent()
)。
因此,在您的后台线程中,您可以执行以下操作:
while (more to do)
{
.... do a step of the search
Display.getDefault().asyncExec(.... UI update code ....);
}
我正在使用 Eclipse RAP 并有以下用例:
- 在
Text
字段中输入搜索文本并开始搜索 - 将
Label
文本更改为 "searching...." - 进行实际搜索(异步)并在
Table
中显示结果
问题,即使在实际搜索开始之前标签应该更改为"searching....",但它更改为"searching...."搜索完成后。
我正在寻找的是一种在标签更改后,在搜索之前 push/force/update 向客户端发送当前 UI 状态的方法:
- 在
Text
字段中输入搜索文本并开始搜索 - 将
Label
文本更改为 "searching...." - 将当前UI状态推送给客户端
- 进行实际搜索(异步)并在
Table
中显示结果
这里有一些示例代码:
Label statusLabel = new Label(parent, SWT.NONE);
Text searchText = new Text(parent, SWT.SEARCH);
searchText.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetDefaultSelected(SelectionEvent e) {
// change label
statusLabel.setText("searching...");
// HERE force client update
// start searching
Display.getCurrent().asyncExec(new Runnable() {
@Override
public void run() {
// do actual search
}
});
}
});
asyncExec
仍然 运行 是 UI 线程中的代码,它只是稍微延迟它直到下一次调用 Display.readAndDispatch
。所以您的搜索代码仍然会阻塞并且不允许标签更新。
您实际上需要 运行 在单独的线程中进行搜索。
asyncExec
旨在在可能的情况下在后台线程中使用 运行 UI 线程中的少量代码。 (您需要在后台线程中使用 Display.getDefault()
而不是 Display.getCurrent()
)。
因此,在您的后台线程中,您可以执行以下操作:
while (more to do)
{
.... do a step of the search
Display.getDefault().asyncExec(.... UI update code ....);
}