0

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 を橋渡ししている同じクラスにコンポジットがあります。このメソッドは String Filename を取り、ファイルを表示する 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() から値を取得して最終ファイルで使用する方法がわかりません。 viewerFile = new File("NEED FILENAME OF SELECTION");

4

2 に答える 2

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で結果を返すことはできないため、文字列の結果は配列に保存されますsyncExec

于 2012-12-05T21:28:47.700 に答える
0

TableViewerを追加して選択への参照を維持することをお勧めしますSelectionChangeListener

ユーザーが から入力を選択するTableViewerと、選択リスナーでイベントを取得し、選択したファイル名を変数に割り当てます。

Swing コードでは、この (変数) ファイル名を使用して Pdf ビューを開きます。Display.async や sync execute CALLS で Swing コードを乱雑にすることはお勧めしません。

于 2012-12-05T22:48:20.270 に答える