SWTChart鼠标事件处理 [英] SWTChart mouse event handling

查看:113
本文介绍了SWTChart鼠标事件处理的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我找到了 SWTChart库,只是想知道如何用鼠标选择一个范围,例如在x轴上从1到3,我会得到所有y轴值,这些值属于所选的x值.

I have found SWTChart library and just wonder how it would be possible to select with the mouse a range e.g. 1 to 3 on the x-axis and I would get all y-axis values which belongs to the selected x values.


(来源: swtchart.org )

package org.swtchart.examples;

import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.swtchart.Chart;
import org.swtchart.ILineSeries;
import org.swtchart.ISeries.SeriesType;

/**
* An example for area chart.
*/
public class AreaChartExample {

    private static final double[] ySeries1 = { 0.1, 0.38, 0.71, 0.92, 1.0 };

    private static final double[] ySeries2 = { 1.2, 3.53, 3.1, 0.1, 0.5 };

    /**
    * The main method.
    * 
    * @param args
    *            the arguments
    */
    public static void main(String[] args) {
        Display display = new Display();
        Shell shell = new Shell(display);
        shell.setText("Area Chart");
        shell.setSize(500, 400);
        shell.setLayout(new FillLayout());

        createChart(shell);

        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
        display.dispose();
    }

    /**
    * create the chart.
    * 
    * @param parent
    *            The parent composite
    * @return The created chart
    */
    static public Chart createChart(Composite parent) {

        // create a chart
        Chart chart = new Chart(parent, SWT.NONE);

        // set titles
        chart.getTitle().setText("Area Chart");

        // create line series
        ILineSeries lineSeries1 = (ILineSeries) chart.getSeriesSet()
                .createSeries(SeriesType.LINE, "line series 1");
        lineSeries1.setYSeries(ySeries1);
        lineSeries1.setLineColor(Display.getDefault().getSystemColor(
                SWT.COLOR_RED));
        lineSeries1.enableArea(true);

        ILineSeries lineSeries2 = (ILineSeries) chart.getSeriesSet()
                .createSeries(SeriesType.LINE, "line series 2");
        lineSeries2.setYSeries(ySeries2);
        lineSeries2.enableArea(true);

        // adjust the axis range
        chart.getAxisSet().adjustRange();

        return chart;
    }
}

在上面的示例中,如何包含一个鼠标事件来选择范围?

How is it possible to include a mouse event for selecting a range in the above example?

谢谢.

推荐答案

以下代码应为您提供有关如何执行此操作的想法.基本上,您必须获取chartchartArea,添加SWT.MouseDownSWT.MouseUp的侦听器,并记住两个事件的位置.回答您的评论:是的,您可以使用SWT.Paint侦听器添加突出显示"功能.

The following code should give you an idea on how to do this. Basically, you have to get the chartArea of the chart, add the listeners for SWT.MouseDown and SWT.MouseUp and remember the position of both events. To answer your comment: Yes, you can add a "highlight" functionality by using the SWT.Paint listener.

import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.swtchart.Chart;
import org.swtchart.IAxis;
import org.swtchart.ILineSeries;
import org.swtchart.ISeries.SeriesType;

    /**
    * An example for area chart.
    */
    public class AreaChartExample {

        private static final double[] ySeries1 = { 0.1, 0.38, 0.71, 0.92, 1.0 };

        private static final double[] ySeries2 = { 1.2, 3.53, 3.1, 0.1, 0.5 };

        /* Used to remember location point of mouse down */
        private static double startX;
        private static double startY;

        private static int startXPos;
        private static int startYPos;

        private static int currentX;
        private static int currentY;

        private static boolean drag = false;

        /**
        * The main method.
        * 
        * @param args
        *            the arguments
        */
        public static void main(String[] args) {
            Display display = new Display();
            Shell shell = new Shell(display);
            shell.setText("Area Chart");
            shell.setSize(500, 400);
            shell.setLayout(new FillLayout());

            createChart(shell);

            shell.open();
            while (!shell.isDisposed()) {
                if (!display.readAndDispatch()) {
                    display.sleep();
                }
            }
            display.dispose();
        }

        /**
        * create the chart.
        * 
        * @param parent
        *            The parent composite
        * @return The created chart
        */
        static public Chart createChart(Composite parent) {

            // create a chart
            final Chart chart = new Chart(parent, SWT.NONE);

            // set titles
            chart.getTitle().setText("Area Chart");

            // create line series
            ILineSeries lineSeries1 = (ILineSeries) chart.getSeriesSet()
                    .createSeries(SeriesType.LINE, "line series 1");
            lineSeries1.setYSeries(ySeries1);
            lineSeries1.setLineColor(Display.getDefault().getSystemColor(
                    SWT.COLOR_RED));
            lineSeries1.enableArea(true);

            ILineSeries lineSeries2 = (ILineSeries) chart.getSeriesSet()
                    .createSeries(SeriesType.LINE, "line series 2");
            lineSeries2.setYSeries(ySeries2);
            lineSeries2.enableArea(true);

            // adjust the axis range
            chart.getAxisSet().adjustRange();

            /* Get the plot area and add the mouse listeners */
            final Composite plotArea = chart.getPlotArea();

            plotArea.addListener(SWT.MouseDown, new Listener() {

                @Override
                public void handleEvent(Event event) {
                    IAxis xAxis = chart.getAxisSet().getXAxis(0);
                    IAxis yAxis = chart.getAxisSet().getYAxis(0);

                    startX = xAxis.getDataCoordinate(event.x);
                    startY = yAxis.getDataCoordinate(event.y);

                    startXPos = event.x;
                    startYPos = event.y;

                    drag = true;
                }
            });

            plotArea.addListener(SWT.MouseUp, new Listener() {

                @Override
                public void handleEvent(Event event) {
                    IAxis xAxis = chart.getAxisSet().getXAxis(0);
                    IAxis yAxis = chart.getAxisSet().getYAxis(0);

                    double endX = xAxis.getDataCoordinate(event.x);
                    double endY = yAxis.getDataCoordinate(event.y);

                    System.out.println(startX + " " + endX);
                    System.out.println(startY + " " + endY);

                    drag = false;

                    plotArea.redraw();
                }
            });

            plotArea.addListener(SWT.MouseMove, new Listener() {

                @Override
                public void handleEvent(Event event) {
                    if(drag)
                    {
                        currentX = event.x;
                        currentY = event.y;

                        plotArea.redraw();
                    }
                }
            });

            plotArea.addListener(SWT.Paint, new Listener() {

                @Override
                public void handleEvent(Event event) {
                    if(drag)
                    {
                        GC gc = event.gc;

                        gc.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_RED));
                        gc.setAlpha(128);

                        int minX = Math.min(startXPos, currentX);
                        int minY = Math.min(startYPos, currentY);

                        int maxX = Math.max(startXPos, currentX);
                        int maxY = Math.max(startYPos, currentY);

                        int width = maxX - minX;
                        int height = maxY - minY;

                        gc.fillRectangle(minX, minY, width, height);
                    }
                }
            });

            return chart;
        }
    }

这篇关于SWTChart鼠标事件处理的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆