2017-01-08 7 views
2

Ich habe beobachtet, dass die Funktionalität von "Zoom-In" und "Zoom-Out" ganz anders als erwartet umgesetzt wurde. Wie zum Beispiel wenn ich einen Schritt "Zoom-out" mache und dann wieder nach einem Schritt von " Hineinzoomen". Ich konnte das Originaldiagramm nicht mehr sehen.Abnormales Verhalten der Zoom- und Zoom-Out-Funktionalität des JFreeChart?

Ich sehe "Zoom-In" und "Zoom-Out" -Funktion von JFrechart nicht in der Synchronisierung.

public class ChartPanelDemo { 

    private static final String title = "Historical Data Graph"; 
    private ChartPanel chartPanel = createChart(); 
    private JButton ZoomX; 
    private JButton ZoomY; 
    private JButton Zoom; 
    private JButton ZoomXOut; 
    private JButton ZoomYOut; 
    private JButton ZoomOut; 
    private JButton originalGraph; 
    private JButton xscaleInc; 
    private JButton xscaleDec; 
    private NumberAxis domainAxis; 
    private NumberAxis rangeAxis; 
    private int UNITS = 1; 
    private static final int COUNT = 100; 

    private JPanel panel; 

    private double[][] sizeFr = { { TableLayout.FILL }, { TableLayout.FILL } }; 

    public ChartPanelDemo() { 
     JFrame f = new JFrame(title); 

     panel = new JPanel(); 
     f.setTitle(title); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setLayout(new BorderLayout(0, 5)); 
     f.add(chartPanel, BorderLayout.CENTER); 
     chartPanel.setMouseWheelEnabled(true); 
     // chartPanel.setHorizontalAxisTrace(true); 
     // chartPanel.setVerticalAxisTrace(true); 
     chartPanel.setZoomInFactor(0.9); 
     chartPanel.setZoomOutFactor(0.9); 

     JPanel panel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); 
     panel.add(createTrace()); 
     panel.add(createDate()); 
     panel.add(createZoom()); 
     panel.add(createZoomOutX()); 
     panel.add(createZoomOutY()); 
     panel.add(createZoomOut()); 
     panel.add(toOriginalGraph()); 
     panel.add(AutoScaleDecXaxis()); 
     //panel.add(AutoScaleDecXaxis()); 
     f.add(panel, BorderLayout.SOUTH); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 



    private JSpinner AutoScaleDecXaxis() { 
     final JSpinner spinner = new JSpinner(
       new SpinnerNumberModel(UNITS, 1, COUNT, 1)); 
      spinner.addChangeListener(new ChangeListener() { 

       @Override 
       public void stateChanged(ChangeEvent e) { 
        JSpinner s = (JSpinner) e.getSource(); 
        Number n = (Number) s.getValue(); 
        domainAxis.setTickUnit(new NumberTickUnit(n.intValue())); 
       } 
      }); 
      return spinner; 
    } 

    private JButton toOriginalGraph() { 
     originalGraph = new JButton(new AbstractAction("RestoreGraph") { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       chartPanel.restoreAutoBounds(); 
      } 

     }); 
     return originalGraph; 
    } 

    private JButton createZoomOut() { 
     ZoomOut = new JButton(new AbstractAction("ZoomOut") { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       ZoomOut.setActionCommand(chartPanel.ZOOM_OUT_BOTH_COMMAND); 
       ZoomOut.addActionListener(chartPanel); 

      } 

     }); 
     return ZoomOut; 
    } 

    private JButton createZoomOutY() { 
     ZoomYOut = new JButton(new AbstractAction("ZoomOutY") { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       ZoomYOut.setActionCommand(chartPanel.ZOOM_OUT_RANGE_COMMAND); 
       ZoomYOut.addActionListener(chartPanel); 
      } 

     }); 
     return ZoomYOut; 
    } 

    private JButton createZoomOutX() { 
     ZoomXOut = new JButton(new AbstractAction("ZoomOutX") { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       ZoomXOut.setActionCommand(chartPanel.ZOOM_OUT_DOMAIN_COMMAND); 
       ZoomXOut.addActionListener(chartPanel); 
      } 
     }); 
     return ZoomXOut; 
    } 

    private JButton createTrace() { 
     ZoomX = new JButton(new AbstractAction("ZoomInX") { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       ZoomX.setActionCommand(chartPanel.ZOOM_IN_DOMAIN_COMMAND); 
       ZoomX.addActionListener(chartPanel); 
       // chartPanel.restoreAutoBounds(); 
      } 
     }); 
     return ZoomX; 
    } 

    private JButton createDate() { 
     ZoomY = new JButton(new AbstractAction("ZoomInY") { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       ZoomY.setActionCommand(chartPanel.ZOOM_IN_RANGE_COMMAND); 
       ZoomY.addActionListener(chartPanel); 
      } 
     }); 
     return ZoomY; 
    } 

    private JButton createZoom() { 
     Zoom = new JButton(new AbstractAction("Zoom") { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       Zoom.setActionCommand(chartPanel.ZOOM_IN_BOTH_COMMAND); 
       Zoom.addActionListener(chartPanel); 
      } 
     }); 
     return Zoom; 
    } 

    private ChartPanel createChart() { 
     XYDataset roiData = createDataset(); 
     JFreeChart chart = createChart(roiData); 
     chart.setBackgroundPaint(new Color(0xBBBBDD)); 
     XYPlot plot = chart.getXYPlot(); 
     XYSplineRenderer r = new XYSplineRenderer(20); 
     plot.setRenderer(r); 
     r.setBaseShapesVisible(true); 
     rangeAxis = (NumberAxis) plot.getRangeAxis(); 
     domainAxis = (NumberAxis) plot.getDomainAxis(); 
     rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits()); 
     domainAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits()); 

     return new ChartPanel(chart); 
    } 

    private JFreeChart createChart(XYDataset dataset) { 
     JFreeChart chart = ChartFactory.createXYLineChart("Historical Data", // chart 
                       // title 
       "X", // x axis label 
       "Y", // y axis label 
       dataset, // data 
       PlotOrientation.VERTICAL, true, // include legend 
       true, // tooltips 
       false // urls 
       ); 
     return chart; 

    } 

    private XYDataset createDataset() { 
     XYSeries series1 = new XYSeries("First"); 
     series1.add(1.0, 1.0); 
     series1.add(2.0, 4.0); 
     series1.add(3.0, 3.0); 
     series1.add(4.0, 5.0); 
     series1.add(5.0, 5.0); 
     series1.add(6.0, 7.0); 
     series1.add(7.0, 7.0); 
     series1.add(8.0, 8.0); 
     XYSeries series2 = new XYSeries("Second"); 
     series2.add(1.0, 5.0); 
     series2.add(2.0, 7.0); 
     series2.add(3.0, 6.0); 
     series2.add(4.0, 8.0); 
     series2.add(5.0, 4.0); 
     series2.add(6.0, 4.0); 
     series2.add(7.0, 2.0); 
     series2.add(8.0, 1.0); 

     XYSeriesCollection dataset = new XYSeriesCollection(); 
     dataset.addSeries(series1); 
     dataset.addSeries(series2); 

     return dataset; 
    } 


    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       ChartPanelDemo cpd = new ChartPanelDemo(); 
      } 
     }); 
    } 
} 

Problem2: Nach zwei Klicks auf ZoomInX enter image description here

Und wieder nach zwei Klicks auf ZoomOutX (die die ursprüngliche Graph ist) enter image description here

aber wieder nach zwei Klicks auf ZoomInX sehe ich die Grafik ein anderes, nicht als das erste Bild in dieser Frage, die sein sollte. enter image description here

+0

Ich habe die Frage mit dem Beispielcode aktualisiert, den ich versuchte. – JAVA

Antwort

4

Ihr Beispiel erscheint die beiden Ansätze here vorgeschlagen Mischen werden, die Chart-Panels Handler Aufruf aus Ihrer eigenen actionPerformed() Umsetzung. Während die Chart-Panel-Handler wiederverwendbar sind, sind sie nicht einspringend. Verwenden Sie stattdessen die Implementierung des Diagrammbereichs direkt. Das Beispiel konzentriert sich unten auf zwei Tasten, um die Domäne in vergrößern und verkleinern:

toolBar.add(createButton("Zoom In X", ZOOM_IN_DOMAIN_COMMAND)); 
toolBar.add(createButton("Zoom Out X", ZOOM_OUT_DOMAIN_COMMAND)); 
… 
private JButton createButton(String name, String command) { 
    final JButton b = new JButton(name); 
    b.setActionCommand(command); 
    b.addActionListener(chartPanel); 
    return b; 
} 

Nach dem Klicken Vergrößern X:

after zoom in x

Nach dem Klicken Verkleinern X:

after zoom out x

In diesem vollständigen Beispiel wird die createButton()-Methode neu bewertet, um die verfügbaren Zoom-Handler zu verwenden, und es wird eine JToolBar veranschaulicht.

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.text.NumberFormat; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JToolBar; 
import org.jfree.chart.ChartFactory; 
import org.jfree.chart.ChartPanel; 
import org.jfree.chart.JFreeChart; 
import org.jfree.chart.axis.NumberAxis; 
import org.jfree.chart.plot.XYPlot; 
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer; 
import org.jfree.data.time.TimeSeries; 
import org.jfree.data.time.TimeSeriesCollection; 
import org.jfree.data.time.Year; 
import org.jfree.data.xy.XYDataset; 
import static org.jfree.chart.ChartPanel.*; 

/** @see https://stackoverflow.com/a/41337259/230513 */ 
public class ZoomDemo { 

    private static final String TITLE = "Return On Investment"; 
    private final ChartPanel chartPanel = createChart(); 

    public ZoomDemo() { 
     JFrame f = new JFrame(TITLE); 
     f.setTitle(TITLE); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setLayout(new BorderLayout(0, 5)); 
     f.add(chartPanel, BorderLayout.CENTER); 
     chartPanel.setMouseWheelEnabled(true); 

     JPanel panel = new JPanel(); 
     JToolBar toolBar = new JToolBar(); 
     toolBar.add(createButton("Zoom In", ZOOM_IN_BOTH_COMMAND)); 
     toolBar.add(createButton("Zoom In X", ZOOM_IN_DOMAIN_COMMAND)); 
     toolBar.add(createButton("Zoom In Y", ZOOM_IN_RANGE_COMMAND)); 
     toolBar.add(createButton("Zoom Out", ZOOM_OUT_BOTH_COMMAND)); 
     toolBar.add(createButton("Zoom Out X", ZOOM_OUT_DOMAIN_COMMAND)); 
     toolBar.add(createButton("Zoom Out Y", ZOOM_OUT_RANGE_COMMAND)); 
     toolBar.add(createButton("Reset", ZOOM_RESET_BOTH_COMMAND)); 
     toolBar.add(createButton("Reset X", ZOOM_RESET_DOMAIN_COMMAND)); 
     toolBar.add(createButton("Reset Y", ZOOM_RESET_RANGE_COMMAND)); 
     panel.add(toolBar); 
     f.add(panel, BorderLayout.SOUTH); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    private JButton createButton(String name, String command) { 
     final JButton b = new JButton(name); 
     b.setActionCommand(command); 
     b.addActionListener(chartPanel); 
     return b; 
    } 

    private ChartPanel createChart() { 
     XYDataset roiData = createDataset(); 
     JFreeChart chart = ChartFactory.createTimeSeriesChart(
      TITLE, "Date", "Value", roiData, true, true, false); 
     XYPlot plot = chart.getXYPlot(); 
     XYLineAndShapeRenderer renderer = 
      (XYLineAndShapeRenderer) plot.getRenderer(); 
     renderer.setBaseShapesVisible(true); 
     NumberFormat currency = NumberFormat.getCurrencyInstance(); 
     currency.setMaximumFractionDigits(0); 
     NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis(); 
     rangeAxis.setNumberFormatOverride(currency); 
     return new ChartPanel(chart); 
    } 

    private XYDataset createDataset() { 
     TimeSeriesCollection tsc = new TimeSeriesCollection(); 
     tsc.addSeries(createSeries("Projected", 200)); 
     tsc.addSeries(createSeries("Actual", 100)); 
     return tsc; 
    } 

    private TimeSeries createSeries(String name, double scale) { 
     TimeSeries series = new TimeSeries(name); 
     for (int i = 0; i < 6; i++) { 
      series.add(new Year(2016 + i), Math.pow(2, i) * scale); 
     } 
     return series; 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       ZoomDemo cpd = new ZoomDemo(); 
      } 
     }); 
    } 
} 
+0

Haben Sie mein Beispiel versucht? Wenn Sie mein Beispiel genommen haben, funktionieren die Schaltflächen beim ersten Klick nicht. und ich sehe seltsames Verhalten von Zoomin und ZoomOut Funktionalität, die meine Frage war. aber wenn ich diese zwei Zeilen des Codes entfernt chartPanel.setZoomInFactor (0.9); chartPanel.setZoomOutFactor (0.9); ZoomIn und ZoomOut Funktionalität funktioniert wie erwartet, aber immer noch mit einigen Problemen, die ich in meiner Frage mit Titelproblem2 erklärt habe. – JAVA

+0

Ja, das ist mir aufgefallen; Die Chart-Panel-Handler sind wiederverwendbar, aber nicht einspringend. Mein Beispiel konzentriert sich auf den Fehler in Ihrem. Versuchen Sie, Ihre Handler zu aktualisieren, wie ich gezeigt habe. – trashgod

+0

jeder Hinweis für diese neuere Frage geschrieben? Http: //stackoverflow.com/questions/41711618/how-can-i-have-negative-and-positive-axis-using-jfreechart? Noredirect = 1 # comment70618972_41711618 – JAVA