我的SWT类中有一个方法可以从我的表中获取所选值。该值实际上是对象的文件名。
public String getPDFFileName() {
int row = viewer.getTable().getSelectionIndex();
if (row != -1) {
return pdfFileName = AplotSaveDataModel.getInstance().getSelectedPDFFileName(row);
}
else {
MessageDialog.openError(null, "PDF Selection Error Message", "You need to select a PDF to view.");
}
return null;
}
我在同一个类中有一个复合桥接SWT和Swing。此方法采用字符串文件名并创建显示文件的Swing Viewer。
protected Control createPDFButtons(Composite parent) {
final Composite swtAwtComponent = new Composite(parent, SWT.EMBEDDED);
GridData mainLayoutData = new GridData(SWT.FILL, SWT.CENTER, true, false);
mainLayoutData.horizontalSpan = 1;
swtAwtComponent.setLayoutData(mainLayoutData);
GridLayout mainLayout = new GridLayout(1, false);
mainLayout.marginWidth = 0;
mainLayout.marginHeight = 0;
swtAwtComponent.setLayout(mainLayout);
final Frame frame = SWT_AWT.new_Frame(swtAwtComponent);
final JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
JButton viewerButton = new JButton("View Selected PDF");
viewerButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent actionevent) {
final File viewerFile = new File(getPDFFileName());
final AplotPdfViewer pdfv = new AplotPdfViewer(true);
try {
pdfv.openFile(viewerFile);
}
catch (IOException e) {
e.printStackTrace();
}
}
});
panel.add(viewerButton);
frame.add(panel);
return swtAwtComponent;
}
如果我尝试在复合中运行getPDFFileName(),则会出现SWT线程错误。我明白它的来源。
我不知道如何从getPDFFileName()获取值并在最终的File viewerFile = new File(“NEED FILENAME OF SELECTION”)中使用它;
答案 0 :(得分:1)
当您尝试访问窗口小部件时,您需要成为UI线程(在您的情况下为Table
)。您可以使用Display.syncExec
JButton viewerButton = new JButton("View Selected PDF");
viewerButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent actionevent) {
// Retrieve the pdf file name in the UI thread
final String[] filename = new String[1];
Display.getCurrent().syncExec(new Runnable() {
public void run() {
filename[0] = getPDFFileName();
}
}
final File viewerFile = new File(filename[0]);
final AplotPdfViewer pdfv = new AplotPdfViewer(true);
try {
pdfv.openFile(viewerFile);
}
catch (IOException e) {
e.printStackTrace();
}
}
});
如果需要多次,请考虑直接在syncExec
方法中调用getPDFFileName
。 String结果保存在数组中,因为您无法使用syncExec
返回结果。
答案 1 :(得分:0)
我建议您通过添加TableViewer
来继续引用SelectionChangeListener
选择。
当用户从TableViewer
中选择输入时,您将在选择侦听器中获取事件并将所选文件名分配给变量。
在Swing代码中,使用此(变量)文件名打开Pdf视图。我不建议使用Display.async来混乱您的Swing代码或同步执行CALLS。