Java SWT方法-从表查看器/Swing方法获取值-使用值

Java SWT方法-从表查看器/Swing方法获取值-使用值,java,swing,swt,Java,Swing,Swt,我的SWT类中有一个从表中获取所选值的方法。该值实际上是对象的文件名 public String getPDFFileName() { int row = viewer.getTable().getSelectionIndex(); if (row != -1) { return pdfFileName = AplotSaveDataModel.getInstance().getSelectedPDFFileName(row); } else {

我的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查看器

 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;
}      
如果我尝试在组合中运行getPdfielName(),就会得到一个SWT线程错误。我知道这是从哪里来的


我不知道如何从getPdfileName()获取值,并在最终文件viewerFile=new File(“需要选择的文件名”)中使用它

当您尝试访问小部件(在您的例子中是
)时,您需要成为一个UI线程。你可以使用


如果需要多次调用,请考虑将对
syncExec
的调用直接放在
getPDFFileName
方法中。字符串结果保存在数组中,因为无法使用
syncExec
返回结果

我建议您通过添加
SelectionChangeListener
来保持对
TableViewer
选择的引用

当用户从
TableViewer
中选择输入时,您将在选择侦听器中获取事件,并将所选文件名分配给变量

在Swing代码中,使用此(变量)文件名打开Pdf视图。我不建议用Display.async或sync execute调用来混乱Swing代码

  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();
        }    
     }
  });