Update/Refresh 日食中的景色 plug-in/RCP?
Update/Refresh a view in an eclipse plug-in/RCP?
我正在尝试构建一个 Eclipse 插件。该插件有 2 个以下组件。 1) 文件浏览器。 2) 图表
已经完成的目标和工作:使用文件浏览器浏览并选择文件后,将根据所选文件制作图表。文件浏览器和图表都在同一父级下的同一 ViewPart 下。所以我在文件浏览器中设置了一个动作侦听器。因此,每当发生选择操作时,我都会在此视图中处理该事件 class。我使用命令参数获取文件路径数据。现在我想更新图表视图。我想我快到了,但由于缺乏理解,我被困住了。我已经尝试了以下 link How to update/refresh a view in an eclipse plug-in? 但它对我不起作用。你能帮忙吗?为了方便起见,下面是来自 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。请注意,我检查了处理程序,它工作正常。但不能只更新图表。感谢您的时间和帮助。
您似乎正试图将处理程序与视图部分放在同一个 class 中 - 这是行不通的。将为处理程序和视图创建 class 的单独实例。在视图中 createPartControl
将是 运行,而 frame
将是 non-null。在处理程序中 createPartControl
不是 运行 因此 frame
将为空。
为处理程序使用单独的 class(扩展 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
class,updateView
是您定义的更新视图的方法。
我正在尝试构建一个 Eclipse 插件。该插件有 2 个以下组件。 1) 文件浏览器。 2) 图表
已经完成的目标和工作:使用文件浏览器浏览并选择文件后,将根据所选文件制作图表。文件浏览器和图表都在同一父级下的同一 ViewPart 下。所以我在文件浏览器中设置了一个动作侦听器。因此,每当发生选择操作时,我都会在此视图中处理该事件 class。我使用命令参数获取文件路径数据。现在我想更新图表视图。我想我快到了,但由于缺乏理解,我被困住了。我已经尝试了以下 link How to update/refresh a view in an eclipse plug-in? 但它对我不起作用。你能帮忙吗?为了方便起见,下面是来自 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。请注意,我检查了处理程序,它工作正常。但不能只更新图表。感谢您的时间和帮助。
您似乎正试图将处理程序与视图部分放在同一个 class 中 - 这是行不通的。将为处理程序和视图创建 class 的单独实例。在视图中 createPartControl
将是 运行,而 frame
将是 non-null。在处理程序中 createPartControl
不是 运行 因此 frame
将为空。
为处理程序使用单独的 class(扩展 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
class,updateView
是您定义的更新视图的方法。