2011-08-16 4 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(); 
    } 
}; 

이것은 여전히 ​​출력을 표시하지 않는다. Action run()은 스레드를 만들고 UI 스레드를 생성합니다. 그렇지 않으면 UI 이외의 속성을 상속합니까?

답변

1

내가 이해 한 바에 따르면 잘못된 스레드 액세스 예외가 발생합니다. 이 경우 UI가 아닌 스레드에서 UI에 액세스하려고합니다.

UIJob을 사용하여 m_frame.add...의 전화를 랩핑하고 일정을 예약하고 실행을 동기화하려면 join() 전화를 걸 수 있습니다.

가 (또 다른 옵션은 Display -> syncExec()을 사용하는 것입니다,하지만 난 UIJob에 충실 것)

+0

감사합니다, 나는 원래의 게시물에 UIJob를 사용하여 내 시도를 추가 ... 원하는 디스플레이는 아직 표시되지 않습니다. 나는 너의 제안을 바르게 적용하고 있는가? – Phil

+0

이전에 오류가 발생 했습니까? 나는 당신이'dataRender.setPanel ... '과'm_frame.add (dataPanel)'을 호출 했으므로, 이전에 프레임에 추가 된 다른 컴포넌트는 어떻게 될까? 그 (것)들을 이제까지 제거 하는가? 또한 구성 요소의 레이아웃을 다시 지정하거나 새로 고침해야 할 수도 있습니다. – sgibly

+0

더 이상 변수에 대한 액세스 오류가 표시되지 않습니다. dataPanel은 m_frame에 추가 된 첫 번째 항목이므로 지금은 제거하는 것이 좋습니다. 컴포지트에 redraw()를 추가하고 프레임에 repaint()를 추가하려고 시도했지만 아직 데이터 플롯이 없습니다. 작업 버튼 외부에서 함수 호출을 실행할 때 데이터 플롯이 여전히 제공되는지 확인했습니다. – Phil

관련 문제