В моем плагине 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 () создает поток, и это, я думаю, создает поток пользовательского интерфейса, или он наследует свойства, не относящиеся к пользовательскому интерфейсу?