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