Eclipse RCP:在选择事件时在同一视图的组件之间传递数据?
Eclipse RCP: Passing data between components of same view at the time of selection event?
我正在尝试构建一个 eclipse 插件。该插件有 2 个以下组件。
1) 文件浏览器。
2) JFreeChart
目标:在使用文件浏览器浏览和 selecting 文件后,JFreeChart 将使用 selected 文件制作图表。 无论我 select 不同的文件多少次,图表都会将这些文件投射到我需要的图表中。
我有一个viewpart。 File-Browser 和 JFreeChart 都使用父组合。我已经实现了静态部分,这意味着我可以使用我的插件浏览文件并且图表可以表示任何文件( 不是我浏览的文件,这就是我被卡住的地方)。 这里我想制作一个图表,当我浏览到不同的文件时会更新。请看看我的代码。
FileChooser.java
mButton = new Button(this, SWT.NONE);
mButton.setText("Browse");
//mText.setText("F:\Java Works\Ground\bin\test.txt");
mText.setText("");
chartDraw = mText.getText();
mButton.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
}
public void widgetSelected(SelectionEvent e) {
FileDialog dlg = new FileDialog(mButton.getShell(), SWT.OPEN );
dlg.setText("Open");
path = dlg.open();
if (path == null) return;
mText.setText(path);
chartDraw = mText.getText();
}
});
ChartView.java
public void createPartControl(Composite parent){
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);
// top banner
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);
// setup bold font
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);
final FileChooser fileChooser = new FileChooser(banner);
gridData.heightHint = 25;
fileChooser.setLayoutData(gridData);
ami = fileChooser.getchartDraw();
// Viewing Chart Starts Here
FetchDataChart chart1 = new FetchDataChart();
//XYSeriesCollection dataset = chart1.createDataset();
XYSeriesCollection dataset = chart1.createDataset(fileChooser.getchartDraw()); // I am extracting the file path and drawing the chart.
JFreeChart chart;
try {
chart = chart1.createChart(dataset);
ChartComposite frame = new ChartComposite(parent, SWT.NONE, chart, true);
frame.pack();
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public String getAmi() {
return ami;
}
现在我的问题是如何连接 FileBrowser 和 JFreeChart,以便我可以在文件路径更改后立即知道文件路径,并且视图部分显示文件在 FileBrowser 中更改时的图表?一些指南和参考资料会有所帮助。对于您的友好信息,我是 Eclipse PDE/RCP 专区的新手。
感谢您的帮助。如果您想了解更多信息来解决此问题,请告诉我。
我已经使用 命令处理程序 方法解决了这个问题。我在 FileChooser.java 中使用 命令参数 将 file-path 传递给处理程序,然后处理程序基于它创建图表。但是当然,您必须处置之前创建的框架才能获得新的 refreshed/updated 视图。请参阅下面的处理程序 class 以获得更好的理解。看看下面代码的更改部分。
FileChooser.java
mButton.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
}
public void widgetSelected(SelectionEvent e) {
FileDialog dlg = new FileDialog(mButton.getShell(), SWT.OPEN );
dlg.setText("Open");
path = dlg.open();
if (path == null) return;
mText.setText(path);
chartDraw = mText.getText();
ArrayList<Parameterization> parameters = new ArrayList<Parameterization>();
IParameter iparam;
IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
ICommandService cmdService = (ICommandService)window.getService(ICommandService.class);
Command cmd = cmdService.getCommand("press.command");
try {
//get the parameter
iparam = cmd.getParameter("press.command.parameter");
Parameterization params = new Parameterization(iparam, chartDraw);
parameters.add(params);
//build the parameterized command
ParameterizedCommand pc = new ParameterizedCommand(cmd, parameters.toArray(new Parameterization[parameters.size()]));
//execute the command
IHandlerService handlerService = (IHandlerService)window.getService(IHandlerService.class);
handlerService.executeCommand(pc, null);
} catch (ExecutionException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (NotDefinedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (NotEnabledException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (NotHandledException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
处理程序 class 如下所示:
public class Handler extends AbstractHandler{
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
String filePath = event
.getParameter("press.command.parameter");
IWorkbenchPage workbenchPage = HandlerUtil.getActiveWorkbenchWindow(event).getActivePage();
IViewPart view = workbenchPage.findView("freechart.views.ChartView");
if (view instanceof ChartView) {
ChartView myView = (ChartView)view;
myView.frame.dispose();
myView.createChart(filePath);
myView.parent.pack();
myView.parent.layout(true);
}
return null;
}
}
我正在尝试构建一个 eclipse 插件。该插件有 2 个以下组件。 1) 文件浏览器。 2) JFreeChart
目标:在使用文件浏览器浏览和 selecting 文件后,JFreeChart 将使用 selected 文件制作图表。 无论我 select 不同的文件多少次,图表都会将这些文件投射到我需要的图表中。
我有一个viewpart。 File-Browser 和 JFreeChart 都使用父组合。我已经实现了静态部分,这意味着我可以使用我的插件浏览文件并且图表可以表示任何文件( 不是我浏览的文件,这就是我被卡住的地方)。 这里我想制作一个图表,当我浏览到不同的文件时会更新。请看看我的代码。
FileChooser.java
mButton = new Button(this, SWT.NONE);
mButton.setText("Browse");
//mText.setText("F:\Java Works\Ground\bin\test.txt");
mText.setText("");
chartDraw = mText.getText();
mButton.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
}
public void widgetSelected(SelectionEvent e) {
FileDialog dlg = new FileDialog(mButton.getShell(), SWT.OPEN );
dlg.setText("Open");
path = dlg.open();
if (path == null) return;
mText.setText(path);
chartDraw = mText.getText();
}
});
ChartView.java
public void createPartControl(Composite parent){
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);
// top banner
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);
// setup bold font
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);
final FileChooser fileChooser = new FileChooser(banner);
gridData.heightHint = 25;
fileChooser.setLayoutData(gridData);
ami = fileChooser.getchartDraw();
// Viewing Chart Starts Here
FetchDataChart chart1 = new FetchDataChart();
//XYSeriesCollection dataset = chart1.createDataset();
XYSeriesCollection dataset = chart1.createDataset(fileChooser.getchartDraw()); // I am extracting the file path and drawing the chart.
JFreeChart chart;
try {
chart = chart1.createChart(dataset);
ChartComposite frame = new ChartComposite(parent, SWT.NONE, chart, true);
frame.pack();
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public String getAmi() {
return ami;
}
现在我的问题是如何连接 FileBrowser 和 JFreeChart,以便我可以在文件路径更改后立即知道文件路径,并且视图部分显示文件在 FileBrowser 中更改时的图表?一些指南和参考资料会有所帮助。对于您的友好信息,我是 Eclipse PDE/RCP 专区的新手。
感谢您的帮助。如果您想了解更多信息来解决此问题,请告诉我。
我已经使用 命令处理程序 方法解决了这个问题。我在 FileChooser.java 中使用 命令参数 将 file-path 传递给处理程序,然后处理程序基于它创建图表。但是当然,您必须处置之前创建的框架才能获得新的 refreshed/updated 视图。请参阅下面的处理程序 class 以获得更好的理解。看看下面代码的更改部分。
FileChooser.java
mButton.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
}
public void widgetSelected(SelectionEvent e) {
FileDialog dlg = new FileDialog(mButton.getShell(), SWT.OPEN );
dlg.setText("Open");
path = dlg.open();
if (path == null) return;
mText.setText(path);
chartDraw = mText.getText();
ArrayList<Parameterization> parameters = new ArrayList<Parameterization>();
IParameter iparam;
IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
ICommandService cmdService = (ICommandService)window.getService(ICommandService.class);
Command cmd = cmdService.getCommand("press.command");
try {
//get the parameter
iparam = cmd.getParameter("press.command.parameter");
Parameterization params = new Parameterization(iparam, chartDraw);
parameters.add(params);
//build the parameterized command
ParameterizedCommand pc = new ParameterizedCommand(cmd, parameters.toArray(new Parameterization[parameters.size()]));
//execute the command
IHandlerService handlerService = (IHandlerService)window.getService(IHandlerService.class);
handlerService.executeCommand(pc, null);
} catch (ExecutionException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (NotDefinedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (NotEnabledException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (NotHandledException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
处理程序 class 如下所示:
public class Handler extends AbstractHandler{
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
String filePath = event
.getParameter("press.command.parameter");
IWorkbenchPage workbenchPage = HandlerUtil.getActiveWorkbenchWindow(event).getActivePage();
IViewPart view = workbenchPage.findView("freechart.views.ChartView");
if (view instanceof ChartView) {
ChartView myView = (ChartView)view;
myView.frame.dispose();
myView.createChart(filePath);
myView.parent.pack();
myView.parent.layout(true);
}
return null;
}
}