在我的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属性?
答案 0 :(得分:1)
据我所知,您获得了无效的线程访问异常。如果是这种情况,您可能正在尝试从非UI线程访问UI。
要解决此问题,您可以使用m_frame.add...
包含UIJob
的调用,安排它并join()
,如果您希望执行同步。
(另一个选择是使用Display -> syncExec()
,但我会坚持UIJob
)