SWT - 从按钮打开对话框的最佳代码过程

时间:2012-09-07 15:30:11

标签: java swt

在我的主GUI应用程序上,有一个按钮可以打开单独的对话框。新对话框有一个包含打印机列表的表。我不能让这个工作。我很确定它可以填充表格。下面是我用来尝试使其工作的代码。

Button plotButton = new Button(composite, SWT.PUSH);
   plotButton.setText("Select Plotter");
   plotButton.addSelectionListener(new SelectionAdapter() {
       public void widgetSelected(SelectionEvent e) {
          startPrinterListOperation();              
          showFooBarDialog();
       }
  });  

这是showFooBarDialog()方法

private void showFooBarDialog() {
  apd = new FooDialog(null);
  apd.create();
  apd.getShell().setSize(700, 400);
  apd.open();      
}

在FooDialog中,我尝试使用从服务器端调用累积的打印机填充表。

private void startPrinterListOperation() {
  listOp = new AplotPrinterListOperation(appReg.getString("aplot.message.GETPRINTERLIST"), session);
  listOp.addOperationListener(new MyOperationListener(this) {
     public void endOperationImpl() {
        try {
            printers = (ArrayList<PrinterProfile>) listOp.getPrinters();
        }
        finally {
           listOp.removeOperationListener(this);
           listOp = null;
        }
     }
  });
  session.queueOperation(listOp);
} 

该方法基本上启动了一个进入服务器并收集可用打印机的操作,然后将它们存储在ArrayList中,这个过程可能需要一两秒钟。

因此,当FooDialog尝试打开并填充表时,我立即在此行上获得空指针错误

 viewer.setInput(parentDialog.getPrintersArray());

我认为ArrayList尚未完成,因此返回Null。

  1. 是否还有其他地方我应该拨打startPrinterListOperation()而不是点击按钮?

  2. 有没有办法让showFooBarDialog();在某个关闭时间之前不执行?

  3. 我可能完全没有尝试这样做。 startPrinterListOperation()方法应该在FooDialog而不是主桂吗?

  4. 您作为SWT程序员如何解决此问题?

  5. 修改 添加表格代码

    private TableViewer createPlotterTable(Composite parent) {
      Composite composite = new Composite(parent, SWT.NONE); 
    
      viewer = new TableViewer(composite, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER);
      createColumns(parent, viewer);
      Table table = viewer.getTable();
      table.setHeaderVisible(true);
      table.setLinesVisible(true);
      viewer.setContentProvider(new ArrayContentProvider());
      viewer.setInput(parentDialog.getPrintersArray());
    
      // Layout the viewer
      GridData gridData = new GridData();
      gridData.verticalAlignment = GridData.FILL;
      gridData.horizontalSpan = 2;
      gridData.grabExcessHorizontalSpace = true;
      gridData.grabExcessVerticalSpace = true;
      gridData.horizontalAlignment = GridData.FILL;
      viewer.getControl().setLayoutData(gridData);
    
      return viewer;
    }
    

    修改

    表代码位于不在主GUI类中的单独类中。

    public class AplotPlotterDialog extends TitleAreaDialog {
       private AplotBaseDialog parentDialog = null;
    

0 个答案:

没有答案