0

在我的主 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而不是 Main Gui 中?

  4. 作为 SWT 程序员,您将如何解决这个问题?

编辑 添加表代码

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;
4

0 回答 0