Eclipse ViewPart未显示新面板

时间:2011-08-16 17:38:31

标签: multithreading eclipse-plugin

在我的Eclipse插件中,我有一个实现ProgressListener的ViewPart。我开始添加一个框架,显示我的数据图,然后从一个文件加载数据,完成后调用我的progressComplete()。这很好。

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

但是,我现在想要删除硬编码文件并让用户从按钮中选择一个文件。我正在使用Action for this按钮(现在,按钮调用相同的硬编码文件名):

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

使用操作按钮时,我试图将m_frame和ViewPart作为ProgressInfo的一部分传递,但是调试告诉我该线程无法访问该变量。


谢谢你。根据你的建议,我写道:

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

这仍然不会在显示屏上显示任何输出。 Action run()创建一个线程,我想创建UI线程,还是继承非UI属性?

1 个答案:

答案 0 :(得分:1)

据我所知,您获得了无效的线程访问异常。如果是这种情况,您可能正在尝试从非UI线程访问UI。

要解决此问题,您可以使用m_frame.add...包含UIJob的调用,安排它并join(),如果您希望执行同步。

(另一个选择是使用Display -> syncExec(),但我会坚持UIJob