gpt4 book ai didi

JAVA - 如何在线程中循环时修改SWT UI

转载 作者:行者123 更新时间:2023-12-02 02:03:58 25 4
gpt4 key购买 nike

我正在尝试实现一个桌面应用程序,该应用程序循环通过一个函数并每 1 秒在 UI 上设置一个文本字段。

但我要么得到

org.eclipse.swt.SWTException: Invalid thread access

当我不使用显示器时

或者当我这样做时,用户界面真的很慢

display.asyncExec(new Runnable() {

我的代码如下所示:

public void open() {
Display display = Display.getDefault();
shell = new Shell();
shell.setSize(486, 322);
shell.setText("SWT Application");

Button btnStartLoop = new Button(shell, SWT.NONE);
btnStartLoop.addMouseListener(new MouseAdapter() {
@Override
public void mouseDown(MouseEvent e) {
SwingUtilities.invokeLater(new Runnable() {
public void run() // updates displayArea
{
while (true) {
try {
text.setText("Text has been set");
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
}
});
btnStartLoop.setBounds(35, 30, 75, 25);
btnStartLoop.setText("Start Loop");

text = new Text(shell, SWT.BORDER);
text.setText("0");
text.setBounds(116, 32, 177, 21);
shell.open();
shell.layout();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
}

有什么办法可以克服这个问题吗?

最佳答案

您绝不能在 UI 线程中 hibernate 。您必须为后台 Activity 使用新的Thread。您可以从线程内调用 Display.asyncExec 来在 UI 线程中运行 UI 更新代码。

btnStartLoop.addMouseListener(new MouseAdapter() {
@Override
public void mouseDown(final MouseEvent e) {
final Thread background = new Thread(new Runnable() {
public void run()
{
while (true) {
try {
Display.getDefault().asyncExec(() -> text.setText("Text has been set"));
Thread.sleep(1000);
} catch (final InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
background.start();
}
});

注意:SwingUtilities 适用于 Swing 应用程序,请勿在 SWT 应用程序中使用它。

您还可以使用 DisplaytimerExec 方法在特定延迟后运行代码,从而避免需要后台线程。

btnStartLoop.addMouseListener(new MouseAdapter() {
@Override
public void mouseDown(final MouseEvent e) {
final Runnable update = new Runnable() {
public void run()
{
text.setText("Text has been set");

Display.getDefault().timerExec(1000, this);
}
};
Display.getDefault().timerExec(0, update);
}
});

关于JAVA - 如何在线程中循环时修改SWT UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51121388/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com