在我的主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。
是否还有其他地方我应该拨打startPrinterListOperation()
而不是点击按钮?
有没有办法让showFooBarDialog();
在某个关闭时间之前不执行?
我可能完全没有尝试这样做。 startPrinterListOperation()
方法应该在FooDialog
而不是主桂吗?
您作为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;