Eclipse RCP:在选择事件时在相同视图的组件之间传递数据?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Eclipse RCP:在选择事件时在相同视图的组件之间传递数据?相关的知识,希望对你有一定的参考价值。

我正在尝试构建一个eclipse插件。该插件有以下2个组件。 1)文件浏览器。 2)JFreeChart

目标:在浏览并使用文件浏览器选择文件后,JFreeChart将使用所选文件制作图表。无论我选择不同文件多少次,图表都会将这些文件投影到我需要的图表中。

我有一个观点。 File-Browser和JFreeChart都使用父组合。我已经实现了静态部分,这意味着我的插件,我可以浏览文件,图表可以代表任何文件(不是我浏览的文件,这是我被卡住的地方)。在这里,我想制作一个图表,当我浏览到不同的文件时将更新。请看看我的代码。

file chooser.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();
        }
    });

chart view.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 chooser.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();
            }
         }
     });

处理程序类如下所示:

    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 RCP:在选择事件时在相同视图的组件之间传递数据?的主要内容,如果未能解决你的问题,请参考以下文章

选择图像不同图像时在所有文本视图中具有相同名称

RCP学习

以编程方式显示来自 Eclipse 插件的视图

Eclipse RCP 插件目标平台

Eclipse RCP 找不到 applicationContext.xml

如何在 RCP 应用程序中将视图拖出工作台?