java - SWT - 灰显并禁用当前 shell

标签 java swt

当我在后台运行一个操作时,我会将光标设置为忙碌,直到该过程完成。有没有办法也灰显并禁用当前的显示/对话框/外壳,直到该过程完成。我想以直观的方式让用户知道某些东西正在运行,但他们必须等待。

编辑

plotButton.addListener(SWT.Selection, new Listener() {
      public void handleEvent(Event arg0) {
         getShell().setEnabled(!getShell().getEnabled());
         getShell().setCursor(new Cursor(Display.getCurrent(), SWT.CURSOR_WAIT));    
         recursiveSetEnabled(getShell(), getShell().getEnabled());
         startPrinterListOperation(); <== This is method that runs operation
      }
  });

运行打印机操作的方法。

private void startPrinterListOperation() {
  listOp = new AplotPrinterListOperation(appReg.getString("aplot.message.GETPRINTERLIST"), session);
  listOp.addOperationListener(new MyOperationListener(this) {
     public void endOperationImpl() {
        try {
           printers.clear();
           printers.addAll((ArrayList<PrinterProfile>) listOp.getPrinters());
           Display.getDefault().asyncExec(new Runnable() {
              public void run() {
                showAplotPlotterDialog(); <== When operation returns - opens selection dialog
              }
           });
        }
        finally {

           listOp.removeOperationListener(this);
           listOp = null;
        }
     }
  });
  session.queueOperation(listOp);
} // end startPrinterListOperation()

showAplotPlotterDialog()(单独类)打开一个带有网络打印机的对话框,然后按下按钮将作业发送到选定的打印机。当该操作完成时,绘图仪对话框关闭 - 这是该方法的结束 - baseDialog 是主 GUI

finally {
           plotOp.removeOperationListener(this);
           plotOp = null;
           Display.getDefault().asyncExec(new Runnable() {
              public void run() {
                baseDialog.removeAllTableRows();
                baseDialog.plotRequestCompleted = true;
                baseDialog.setResultsButtonVisibility();
                getShell().close();

              }
           });
        }

最佳答案

以下内容应该可以满足您的要求。它将递归地禁用 Shell 中的所有 Control 并将其灰显。 Shell 本身没有 setGrayed 方法,但这可以工作:

public static void main(String[] args) {
    final Display display = new Display();
    final Shell shell = new Shell(display);
    shell.setLayout(new FillLayout());

    Button button = new Button(shell, SWT.PUSH);
    button.setText("Button");

    button.addListener(SWT.Selection, new Listener() {

        @Override
        public void handleEvent(Event arg0) {
            shell.setEnabled(!shell.getEnabled());
            shell.setCursor(new Cursor(display, SWT.CURSOR_WAIT));      
            recursiveSetEnabled(shell, shell.getEnabled());
        }
    });

    new Text(shell, SWT.NONE).setText("TEXT");

    shell.setSize(400, 400);
    shell.open();

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

private static void recursiveSetEnabled(Control control, boolean enabled) {
    if (control instanceof Composite)
    {
        Composite comp = (Composite) control;

        for (Control c : comp.getChildren())
            recursiveSetEnabled(c, enabled);
    }
    else
    {
        control.setEnabled(enabled);
    }
}

关于java - SWT - 灰显并禁用当前 shell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12679450/

相关文章:

java - 为什么在我专门阻止这种情况后,一个随机 int 会变得与另一个随机 int 相同?

java - 检测异步 JMS MessageConsumer 何时出现异常?

java - 数据存储查询超时

java - 网络服务网址

java - 使用java在arduino ide上运行c的arduino sketch

java - 如何显示特定时间(5秒)的文本框

java - SWT/JFace TreeColumn 重新排序 - setMoveable() 问题

java - SWT TableEditor 在 Ubuntu 中不显示文本框

java - 如何减少从 Uniscribe ScriptItemize 返回的运行次数

java - CTabFolder布局控件不渲染