JFreeChart的放大缩小功能异常? [英] Abnormal Behaviour of the Zoom In and Zoom Out Functionality of the JFreeChart?

查看:32
本文介绍了JFreeChart的放大缩小功能异常?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我观察到放大"和缩小"的功能与预期的完全不同.例如,当我执行一步缩小",然后在后退一步后再次执行放大".我再也看不到原始图表了.

我没有看到 JFreechart 的放大"和缩小"功能同步.

public class ChartPanelDemo {private static final String title =历史数据图";私人 ChartPanel chartPanel = createChart();私人 JButton ZoomX;私人 JButton ZoomY;私人 JButton 缩放;私有 JButton ZoomXOut;私人 JButton ZoomYOut;私人 JButton ZoomOut;私有 JButton 原图;私人 JButton xscaleInc;私人 JButton xscaleDec;私有 NumberAxis 域轴;私有 NumberAxis rangeAxis;私有整数单位 = 1;私有静态最终 int COUNT = 100;私人 JPanel 面板;private double[][] sizeFr = { { TableLayout.FILL }, { TableLayout.FILL } };公共图表面板演示(){JFrame f = new JFrame(title);面板 = 新 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.setHorizo​​ntalAxisTrace(true);//chartPanel.setVerticalAxisTrace(true);chartPanel.setZoomInFactor(0.9);chartPanel.setZoomOutFactor(0.9);JPanel 面板 = 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(面板,BorderLayout.SOUTH);f.pack();f.setLocationRelativeTo(null);f.setVisible(true);}私人 JSpinner AutoScaleDecXaxis() {最终的 JSpinner Spinner = new JSpinner(新 SpinnerNumberModel(UNITS, 1, COUNT, 1));spinner.addChangeListener(new ChangeListener() {@覆盖public void stateChanged(ChangeEvent e) {JSpinner s = (JSpinner) e.getSource();Number n = (Number) s.getValue();domainAxis.setTickUnit(new NumberTickUnit(n.intValue()));}});返回微调器;}私有 JButton toOriginalGraph() {originalGraph = new JButton(new AbstractAction("RestoreGraph") {@覆盖public void actionPerformed(ActionEvent e) {chartPanel.restoreAutoBounds();}});返回原图;}私人 JButton createZoomOut() {ZoomOut = new JButton(new AbstractAction("ZoomOut") {@覆盖public void actionPerformed(ActionEvent e) {ZoomOut.setActionCommand(chartPanel.ZOOM_OUT_BOTH_COMMAND);ZoomOut.addActionListener(chartPanel);}});返回 ZoomOut;}私人 JButton createZoomOutY() {ZoomYOut = new JButton(new AbstractAction("ZoomOutY") {@覆盖public void actionPerformed(ActionEvent e) {ZoomYOut.setActionCommand(chartPanel.ZOOM_OUT_RANGE_COMMAND);ZoomYOut.addActionListener(chartPanel);}});返回 ZoomYOut;}私人 JButton createZoomOutX() {ZoomXOut = new JButton(new AbstractAction("ZoomOutX") {@覆盖public void actionPerformed(ActionEvent e) {ZoomXOut.setActionCommand(chartPanel.ZOOM_OUT_DOMAIN_COMMAND);ZoomXOut.addActionListener(chartPanel);}});返回 ZoomXOut;}私有 JButton createTrace() {ZoomX = new JButton(new AbstractAction("ZoomInX") {@覆盖public void actionPerformed(ActionEvent e) {ZoomX.setActionCommand(chartPanel.ZOOM_IN_DOMAIN_COMMAND);ZoomX.addActionListener(chartPanel);//chartPanel.restoreAutoBounds();}});返回 ZoomX;}私人 JButton createDate() {ZoomY = new JButton(new AbstractAction("ZoomInY") {@覆盖public void actionPerformed(ActionEvent e) {ZoomY.setActionCommand(chartPanel.ZOOM_IN_RANGE_COMMAND);ZoomY.addActionListener(chartPanel);}});返回 ZoomY;}私人 JButton createZoom() {Zoom = new JButton(new AbstractAction("Zoom") {@覆盖public void actionPerformed(ActionEvent e) {Zoom.setActionCommand(chartPanel.ZOOM_IN_BOTH_COMMAND);Zoom.addActionListener(chartPanel);}});返回缩放;}私人图表面板 createChart() {XYDataset roiData = createDataset();JFreeChart 图表 = createChart(roiData);chart.setBackgroundPaint(新颜色(0xBBBBDD));XYPlot 图 = chart.getXYPlot();XYSplineRenderer r = 新的 XYSplineRenderer(20);plot.setRenderer(r);r.setBaseShapesVisible(true);rangeAxis = (NumberAxis) plot.getRangeAxis();domainAxis = (NumberAxis) plot.getDomainAxis();rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());domainAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());返回新的图表面板(图表);}私人 JFreeChart createChart(XYDataset 数据集){JFreeChart chart = ChartFactory.createXYLineChart("历史数据",//图表//标题"X",//x 轴标签"Y",//y 轴标签数据集,//数据PlotOrientation.VERTICAL, true,//包括图例true,//工具提示false//网址);返回图表;}私人 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 数据集 = new XYSeriesCollection();数据集.addSeries(series1);数据集.addSeries(series2);返回数据集;}公共静态无效主(字符串 [] args){EventQueue.invokeLater(new Runnable() {@覆盖公共无效运行(){ChartPanelDemo cpd = new ChartPanelDemo();}});}}

问题 2:点击 ZoomInX 两次后

再次点击 ZoomOutX(这是原始图表)

但是再次在 ZoomInX 上单击两次后,我看到了一个不同的图形,而不是这个问题中的第一个图像.

解决方案

您的示例似乎混合了

点击缩小X后:

这个完整的示例重构了 createButton() 方法以使用可用的缩放处理程序并使用 JToolBar.

import java.awt.BorderLayout;导入 java.awt.EventQueue;导入 java.text.NumberFormat;导入 javax.swing.JButton;导入 javax.swing.JFrame;导入 javax.swing.JPanel;导入 javax.swing.JToolBar;导入 org.jfree.chart.ChartFactory;导入 org.jfree.chart.ChartPanel;导入 org.jfree.chart.JFreeChart;导入 org.jfree.chart.axis.NumberAxis;导入 org.jfree.chart.plot.XYPlot;导入 org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;导入 org.jfree.data.time.TimeSeries;导入 org.jfree.data.time.TimeSeriesCollection;导入 org.jfree.data.time.Year;导入 org.jfree.data.xy.XY 数据集;导入静态 org.jfree.chart.ChartPanel.*;/** @see https://stackoverflow.com/a/41337259/230513 */公共类 ZoomDemo {private static final String TITLE = "投资回报";私人最终 ChartPanel chartPanel = createChart();公共 ZoomDemo() {JFrame f = 新 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 面板 = new JPanel();JToolBar toolBar = new JToolBar();toolBar.add(createButton("放大", ZOOM_IN_BOTH_COMMAND));toolBar.add(createButton("放大 X", ZOOM_IN_DOMAIN_COMMAND));toolBar.add(createButton("Zoom In Y", ZOOM_IN_RANGE_COMMAND));toolBar.add(createButton("缩小", 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("重置 X", ZOOM_RESET_DOMAIN_COMMAND));toolBar.add(createButton("重置 Y", ZOOM_RESET_RANGE_COMMAND));面板.添加(工具栏);f.add(面板,BorderLayout.SOUTH);f.pack();f.setLocationRelativeTo(null);f.setVisible(true);}私有 JButton createButton(字符串名称,字符串命令){final JButton b = new JButton(name);b.setActionCommand(命令);b.addActionListener(chartPanel);返回 b;}私人图表面板 createChart() {XYDataset roiData = createDataset();JFreeChart 图表 = ChartFactory.createTimeSeriesChart(TITLE, "Date", "Value", roiData, true, true, false);XYPlot 图 = chart.getXYPlot();XYLineAndShapeRenderer 渲染器 =(XYLineAndShapeRenderer) plot.getRenderer();renderer.setBaseShapesVisible(true);NumberFormat 货币 = NumberFormat.getCurrencyInstance();货币.setMaximumFractionDigits(0);NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();rangeAxis.setNumberFormatOverride(currency);返回新的图表面板(图表);}私人 XYDataset createDataset() {TimeSeriesCollection tsc = new TimeSeriesCollection();tsc.addSeries(createSeries("Projected", 200));tsc.addSeries(createSeries("实际", 100));返回 tsc;}私人时间序列 createSeries(String name, double scale) {时间序列系列 = 新时间序列(名称);for (int i = 0; i <6; i++) {series.add(new Year(2016 + i), Math.pow(2, i) * scale);}回归系列;}公共静态无效主(字符串 [] args){EventQueue.invokeLater(new Runnable() {@覆盖公共无效运行(){ZoomDemo cpd = new ZoomDemo();}});}}

I have observed that the functionality of the "Zoom-In" and "Zoom-out" was implemented quite different than expected.Like for example when i do one step "Zoom-out" and then again after one step back of "Zoom-In". I couldn't see the Original graph again.

I don't see "Zoom-In" and "Zoom-out" functionality of JFreechart to be in the sync.

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: After two clicks on ZoomInX

And again after two clicks on ZoomOutX(Which is the original graph)

But Again after two clicks on ZoomInX I see the graph a different one, not as the first image in this question which should be.

解决方案

Your example appears to be mixing the two approaches suggested here, invoking the chart panel's handler from within your own actionPerformed() implementation. While the chart panel handlers are reusable, they are not re-entrant. Instead, use the chart panel's implementation directly. The example below focuses on two buttons to zoom the domain in and out:

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

After clicking Zoom In X:

After clicking Zoom Out X:

This complete example re-factors the createButton() method to exercise the available zoom handlers and illustrates using a JToolBar.

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

这篇关于JFreeChart的放大缩小功能异常?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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