[英]Update/Refresh a view in an eclipse plug-in/RCP?
我正在嘗試構建一個eclipse插件。 該插件有2個以下組件。 1)文件瀏覽器。 2)圖表
目標和工作已經完成:使用文件瀏覽器瀏覽並選擇文件后,將基於所選文件制作圖表。 文件瀏覽器和圖表都在同一父項下的同一ViewPart下。 所以我在文件瀏覽器中設置了一個動作監聽器。 因此,每當發生選擇操作時,我都會在此視圖類中處理事件。 我使用命令參數獲取文件路徑數據。 現在我想更新圖表視圖。 我想我快到了,但由於缺乏理解,我陷入了困境。 我已經嘗試過以下鏈接如何在Eclipse插件中更新/刷新視圖? 但這對我不起作用。 你能幫忙嗎? 為了方便起見,以下是ViewPart中的代碼。
public ChartComposite frame;
public FileChooser fileChooser;
public XYSeriesCollection dataset;
public FetchDataChart chart1 = new FetchDataChart();
public JFreeChart chart;
public Composite parent;
public void createPartControl(Composite _parent){
parent = _parent;
createBrowser();
}
public void createBrowser() {
Composite top = new Composite(parent, SWT.NONE);// embedded Composite
// setup the layout of top to be GridLayout.
GridLayout layout1 = new GridLayout();
layout1.marginHeight = 0;
layout1.marginWidth = 0;
top.setLayout(layout1);
Composite banner = new Composite(top, SWT.NONE);// banner is added to
// "top"
banner.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL,
GridData.VERTICAL_ALIGN_BEGINNING, true, false));
layout1 = new GridLayout();
layout1.marginHeight = 5;
layout1.marginWidth = 10;
layout1.numColumns = 1;
banner.setLayout(layout1);
Font boldFont = JFaceResources.getFontRegistry().getBold(
JFaceResources.DEFAULT_FONT);
GridData gridData = new GridData();
gridData.horizontalAlignment = SWT.FILL;
gridData.minimumWidth = 400;
gridData.minimumHeight = 50;
gridData.grabExcessHorizontalSpace = true;
Label l = new Label(banner, SWT.WRAP);
l.setText("Source File:");
l.setFont(boldFont);
fileChooser = new FileChooser(banner);
gridData.heightHint = 25;
fileChooser.setLayoutData(gridData);
createChart(""); // here i call the create chart method
}
public void createChart(String filePath) {
chart1 = new FetchDataChart();
dataset = chart1.createDataset(filePath);
try {
chart = chart1.createChart(dataset);
frame = new ChartComposite(parent, SWT.NONE, chart, true);
frame.pack();
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void setFocus() {
}
@Override
public void addHandlerListener(IHandlerListener handlerListener) {
}
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
String filePath = event
.getParameter("press.command.parameter");
Display.getDefault().asyncExec(new Runnable() {
public void run() {
frame.dispose();
createChart(filePath);
parent.pack();
parent.layout(true);
}
});
return null;
}
@Override
public boolean isEnabled() {
return true;
}
@Override
public boolean isHandled() {
return true;
}
@Override
public void removeHandlerListener(IHandlerListener handlerListener) {
}
我在frame.dispose()中得到NullPointerException ; 事件發生時。 請通知我我檢查了處理程序,它正在正常工作。 但不能僅更新圖表。 感謝您的時間和幫助。
看來您正在嘗試將處理程序與視圖部件放在同一類中-這將無法工作。 將為處理程序和視圖創建該類的單獨實例。 在視圖中, createPartControl
將運行,並且frame
為非null。 在處理程序中, createPartControl
未運行,因此frame
為空。
對處理程序使用單獨的類(擴展AbstractHandler
)。 在處理程序中,找到視圖並在視圖上調用方法以進行更新。 就像是:
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
String filePath = event.getParameter("press.command.parameter");
IWorkbenchPage page = HandlerUtil.getActiveWorkbenchWindow(event).getActivePage();
IViewPart view = page.findView("your.view.id");
if (view instanceof MyViewClass) {
MyViewClass myView = (MyViewClass)view;
myView.updateView(filePath);
}
其中MyViewClass
是您的ViewPart
類,而updateView
是您定義的更新視圖的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.