gpt4 book ai didi

java - 在 swt 按钮监听器中刷新 gui

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

我有以下类(class)。

  1. 为什么 btnDecorate 始终处于启用状态?我想在循环处理时禁用该按钮。
  2. 为什么text.redraw()只能在循环结束时起作用?我想在每个角色上依次看到该框。

 

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.*;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;

public class SampleRefreshStyledText {

public static void main(String[] args) {
final Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout(SWT.VERTICAL));
final Button btnDecorate = new Button(shell, SWT.NONE);
btnDecorate.setText("Decorate");

final StyledText text = new StyledText(shell, SWT.NONE);
text.setText("ABCDEFGHIJKLMNOPRQ\n1234567890");

btnDecorate.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent event) {
btnDecorate.setEnabled(false);

for (int i = 0; i < text.getText().length(); i++) {
StyleRange styleRange = new StyleRange();
styleRange.start = i;
styleRange.length = 1;
styleRange.borderColor = display.getSystemColor(SWT.COLOR_RED);
styleRange.borderStyle = SWT.BORDER_SOLID;
styleRange.background = display.getSystemColor(SWT.COLOR_GRAY);

text.setStyleRange(null);
text.setStyleRange(styleRange);
text.redraw();

try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

btnDecorate.setEnabled(true);
}

@Override
public void widgetDefaultSelected(SelectionEvent arg0) {}
});

shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) display.sleep();
}
display.dispose();
}
}

最佳答案

您无法使用 SWT 编写这样的循环。

所有 UI 操作都发生在单个 UI 线程上。调用 Thread.sleep 会使 UI 线程进入休眠状态,并且不会发生任何事情。

redraw 调用仅请求重绘文本,直到下次运行 display.readAndDispatch() 时才会真正发生,因此请重复执行此操作在循环中不起作用。

您要做的就是运行循环的第一步一次。然后,您必须安排在 500 毫秒后运行下一步,不阻塞线程。您可以使用 Display.timerExec 方法来请求稍后运行代码:

display.timerExec(500, runnable);

其中runnable是一个实现Runnable的类,它执行下一步。在此代码末尾,您再次调用 timerExec,直到完成所有步骤。

关于java - 在 swt 按钮监听器中刷新 gui,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39273034/

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