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

时间:2012-12-05 21:12:32

标签: java swing swt

我的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”)中使用它;

2 个答案:

答案 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。