Java 刷新swt按钮侦听器中的gui

Java 刷新swt按钮侦听器中的gui,java,button,swt,redraw,styledtext,Java,Button,Swt,Redraw,Styledtext,我有以下课程 为什么总是启用btnDecorate?我想在循环正在处理时禁用该按钮 为什么text.redraw()只在循环结束时起作用?我想在每个角色上依次看到方框 import org.eclipse.swt.swt; 导入org.eclipse.swt.custom.*; 导入org.eclipse.swt.events.SelectionEvent; 导入org.eclipse.swt.events.SelectionListener; 导入org.eclipse.swt.layout

我有以下课程

  • 为什么总是启用
    btnDecorate
    ?我想在循环正在处理时禁用该按钮
  • 为什么
    text.redraw()
    只在循环结束时起作用?我想在每个角色上依次看到方框
  • import org.eclipse.swt.swt;
    导入org.eclipse.swt.custom.*;
    导入org.eclipse.swt.events.SelectionEvent;
    导入org.eclipse.swt.events.SelectionListener;
    导入org.eclipse.swt.layout.*;
    导入org.eclipse.swt.widgets.*;
    公共类采样器EFreshStyledText{
    公共静态void main(字符串[]args){
    最终显示=新显示();
    外壳=新外壳(显示);
    shell.setLayout(新填充布局(SWT.VERTICAL));
    最终按钮BTN装饰=新按钮(外壳,SWT.无);
    btnDecorate.setText(“装饰”);
    final StyledText text=新StyledText(shell,SWT.NONE);
    setText(“ABCDEFGHIJKLMNOPRQ\n1234567890”);
    btnDecorate.addSelectionListener(新建SelectionListener(){
    @凌驾
    公共无效widgetSelected(SelectionEvent事件){
    btnDecorate.setEnabled(false);
    for(int i=0;i
    您不能用SWT编写这样的循环

    所有UI操作都发生在单个UI线程上。调用
    Thread.sleep
    会使UI线程处于睡眠状态,而不会发生任何事情

    redraw
    调用仅请求重新绘制文本,直到下一次运行
    display.readAndDispatch()
    时才会实际发生,因此在循环中重复这样做是行不通的

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

    display.timerExec(500, runnable);
    

    其中
    runnable
    是实现执行下一步的
    runnable
    的类。在代码结束时,您再次调用
    timerExec
    ,直到完成所有步骤。

    您不能用SWT编写这样的循环

    所有UI操作都发生在单个UI线程上。调用
    Thread.sleep
    会使UI线程处于睡眠状态,而不会发生任何事情

    redraw
    调用仅请求重新绘制文本,直到下一次运行
    display.readAndDispatch()
    时才会实际发生,因此在循环中重复这样做是行不通的

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

    display.timerExec(500, runnable);
    
    其中
    runnable
    是实现执行下一步的
    runnable
    的类。在代码结束时,再次调用
    timerExec
    ,直到完成所有步骤