SWT - 灰显并禁用当前shell

时间:2012-10-01 19:08:45

标签: java swt

当我在后台运行一个操作时,我将光标设置为忙,直到该过程完成。有没有办法在进程完成之前灰显并禁用当前的显示/对话框/ Shell。我希望在视觉上让用户知道某些东西在起作用,他们必须等待。

修改

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()(Seperate Class)打开一个带网络打印机的对话框,然后按下按钮将作业发送到所选的打印机。当该操作完成时,绘图仪对话框关闭 - 这是该方法的结束 - baseDialog是MAIN GUI

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

              }
           });
        }

3 个答案:

答案 0 :(得分:2)

以下应该做你想要的。它将递归地禁用并灰显Control中的所有ShellShell本身没有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);
    }
}

答案 1 :(得分:1)

使用

BusyIndicator.showWhile(Display.getDefault(), new Runnable()
{

    public void run()
    {
        //operation
    }
});

它为当前Shell的所有WindowDialogDisplay,...)设置忙碌光标,直到Runnable.run()被执行

答案 2 :(得分:0)

Baz的回答对我来说是一个很好的开始,但由于它延伸Combo,因此不会对Composite采取行动。通过无条件呼叫setEnabled,每个Control(包括Combo)都会被正确启用/禁用。

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

        for (Control c : comp.getChildren())
            recursiveSetEnabled(c, enabled);
    }

    control.setEnabled(enabled);
}