Eclipse ViewPart не показывает новую панель - PullRequest
0 голосов
/ 16 августа 2011

В моем плагине Eclipse у меня есть ViewPart, который реализует ProgressListener.Я начинаю добавлять рамку, которая будет отображать мой график данных, а затем загружать данные из файла, который вызывает мой 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();
}

Однако теперь я хочу удалить жестко закодированный файл и позволить пользователю выбрать файл из кнопки.Я использую действие для этой кнопки (где на данный момент кнопка вызывает то же жестко закодированное имя файла), что и:

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

Это все равно не дает никакого вывода на дисплей.Действие run () создает поток, и это, я думаю, создает поток пользовательского интерфейса, или он наследует свойства, не относящиеся к пользовательскому интерфейсу?

1 Ответ

1 голос
/ 16 августа 2011

Насколько я понимаю, вы получаете недопустимое исключение доступа к потоку. В этом случае вы, вероятно, пытаетесь получить доступ к пользовательскому интерфейсу из потока, не являющегося пользовательским интерфейсом.

Чтобы это исправить, вы можете заключить вызов для m_frame.add... в UIJob, запланировать его и join(), если вы хотите, чтобы выполнение было синхронизировано.

(другой вариант - использовать Display -> syncExec(), но я бы придерживался UIJob)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...