2012-09-14 3 views
1

J'ai trouvé SWTChart library et je me demande comment il serait possible de sélectionner avec la souris une plage, par ex. 1 à 3 sur l'axe des abscisses et j'obtiendrais toutes les valeurs de l'axe y qui appartiennent aux valeurs x sélectionnées.Gestion des événements souris SWTChart

a busy cat http://www.swtchart.org/screenshots/img/area.png

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; 
    } 
} 

Comment est-il possible d'inclure un événement de la souris pour sélectionner une plage dans l'exemple ci-dessus?

Merci à l'avance.

Répondre

1

Le code suivant devrait vous donner une idée sur la façon de procéder. Fondamentalement, vous devez obtenir le chartArea du chart, ajouter les écouteurs pour SWT.MouseDown et SWT.MouseUp et se souvenir de la position des deux événements. Pour répondre à votre commentaire: Oui, vous pouvez ajouter une fonctionnalité de surlignage en utilisant l'écouteur SWT.Paint.

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; 
     } 
    } 
+0

Merci pour votre travail. Serait-il possible de rendre la surbrillance visible! [Comme ceci] (http://2.asset.soup.io/asset/0559/4338_cfaf_960.png)? – user977828

+0

Merci pour votre solution cela fonctionne. – user977828