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 이외의 속성을 상속합니까?
감사합니다, 나는 원래의 게시물에 UIJob를 사용하여 내 시도를 추가 ... 원하는 디스플레이는 아직 표시되지 않습니다. 나는 너의 제안을 바르게 적용하고 있는가? – Phil
이전에 오류가 발생 했습니까? 나는 당신이'dataRender.setPanel ... '과'm_frame.add (dataPanel)'을 호출 했으므로, 이전에 프레임에 추가 된 다른 컴포넌트는 어떻게 될까? 그 (것)들을 이제까지 제거 하는가? 또한 구성 요소의 레이아웃을 다시 지정하거나 새로 고침해야 할 수도 있습니다. – sgibly
더 이상 변수에 대한 액세스 오류가 표시되지 않습니다. dataPanel은 m_frame에 추가 된 첫 번째 항목이므로 지금은 제거하는 것이 좋습니다. 컴포지트에 redraw()를 추가하고 프레임에 repaint()를 추가하려고 시도했지만 아직 데이터 플롯이 없습니다. 작업 버튼 외부에서 함수 호출을 실행할 때 데이터 플롯이 여전히 제공되는지 확인했습니다. – Phil