2011-08-16 19 views
0

私のEclipseプラグインには、ProgressListenerを実装するViewPartがあります。私は私のデータプロットを表示し、完了したら私のprogressComplete()を呼び出すファイルからデータをロードするフレームを追加し始めます。これは正常に動作します。Eclipse ViewPartに新しいパネルが表示されない

public void createPartControl(Composite parent) 
{ 
    parentComposite = parent; 

    Composite composite = new Composite(parentComposite, SWT.EMBEDDED); 
    m_frame = SWT_AWT.new_Frame(composite); 

    String fileName = "/Users/fred/Documents/file.ipf"; 
    startFileLoad(fileName, -1); 

    createActions(); 
} 

ただし、ハードコードされたファイルを削除し、ユーザーがボタンからファイルを選択するようにしたいとします。表示

m_actionOpenDataFile = new Action() 
{ 
    public void run() 
    { 
     String fileName = "/Users/fred/Documents/file.ipf"; 
     startFileLoad(fileName, -1); 
    } 
}; 
m_actionOpenDataFile.setText("Open"); 
m_actionOpenDataFile.setToolTipText("Open file"); 
m_actionOpenDataFile.setImageDescriptor(ImageDescriptor.createFromURL(ic.getURL("file.png"))); 

アクションが実行され、ファイルがロードされ、このボタンを選択する、しかしパネル:私は(今のところ、ボタンは同じハードコードファイル名を呼び出して、)このボタンのアクションを使用していますデータはEclipse ViewPartに表示されません。誰もがこれがなぜそうであるか提案することができますか?アクションボタンを使用している場合

public void progressComplete(ProgressInfo info) 
{ 
    DataFile dataFile = (DataFile)info.getSource(); 
    if(dataFile != null) 
    { 
    try 
    { 
    TData data = new TData(dataFile, this, "data_progress"); 
    data.parsedFile(); 

    DataRender dataRender = new DataRender(this, data); 
    DataPanel dataPanel = new DataPanel(data, dataRender); 

    dataRender.setPanel(dataPanel.getBufferPanel()); 
    data.setAssociatedPanel(dataPanel); 
    data.addParserProgressListener(dataPanel); 

    m_frame.add(dataPanel); 

、私はProgressInfoの一部としてm_frameとViewPartに合格しようとしているが、デバッグは、変数がスレッドによってアクセスすることができないことを私に伝えます。


ありがとうございます。あなたの提案から私は書いた:

m_actionOpenDataFile = new Action() 
{ 
    public void run() 
    { 
    new UIJob("load data") 
    { 
     public IStatus runInUIThread(IProgressMonitor monitor) 
     { 
      String fileName = "/Users/fred/Documents/file.ipf"; 
      startFileLoad(fileName, -1); 
      return Status.OK_STATUS; 
     } 
    }.schedule(); 
    } 
}; 

これはまだ表示されません。アクションrun()はスレッドを作成し、これはUIスレッドを作成するか、UI以外のプロパティを継承していますか?

答えて

1

私が理解するところでは、無効なスレッドアクセス例外が発生します。このような場合は、UI以外のスレッドからUIにアクセスしようとしている可能性があります。

これを修正するには、UIJobm_frame.add...のコールをラップしてスケジュールし、実行を同期させる場合はjoin()に設定することができます。

(別のオプションはDisplay -> syncExec()を使用することですが、私はUIJobに固執するだろう)

+0

おかげで、私は最初の投稿にUIジョブを使用する私の試みを追加...所望の表示はまだ見えません。あなたの提案を正しく適用していますか? – Phil

+0

あなたはまだ前に得たエラーを受け取りますか?私はあなたが 'dataRender.setPanel ...'と 'm_frame.add(dataPanel)'を呼ぶことを知っているので、以前にフレームに追加された他のコンポーネントはどうなるのでしょうか?あなたはそれらを削除しますか?また、コンポーネントのレイアウトを変更する必要があります(または、何らかの方法でリフレッシュする必要があるかもしれません)。 – sgibly

+0

私はもう変数にアクセスエラーを取得しません。 dataPanelはm_frameに追加される最初のものなので、今は削除しても問題ありません。コンポジットにredraw()を追加し、フレームにrepaint()を追加しようとしましたが、データプロットはまだありません - アクションボタンの外で関数呼び出しを発行するときにデータプロットが与えられていることを確認しました。 – Phil

関連する問題