【问题标题】:JfreeChart: Scroll XYBarChart Horizontally - (chart translation and navigation)JfreeChart:水平滚动 XYBarChart -(图表翻译和导航)
【发布时间】:2010-07-12 20:06:46
【问题描述】:

我正在尝试水平滚动我的 XYBarChart,我正在关注 JfreeChart 的演示“TranslateDemo1.java”之一,您可以在其中找到源代码:

http://code.google.com/p/cori-chenxx/source/browse/aliper/trunk/aliper-core/src/test/java/com/alibaba/aliper/TranslateDemo1.java?spec=svn148&r=148

源代码适用于“TimeSeriesChart”。

但是我尝试使用“XYBarChart”,但当我滑动条时,行为不一样。

为了清楚起见,我将第 157 行替换为以下源代码:

JFreeChart chart1= ChartFactory.createXYBarChart(
                "Title", 
                null, 
                true, 
                "Ylabel", 
                xyDatasetTranslating, 
                PlotOrientation.VERTICAL, 
                true, 
                true, 
                false);

有人知道为什么应用程序会这样吗?以及我该如何解决它。

谢谢,

【问题讨论】:

    标签: java graphics jfreechart charts


    【解决方案1】:

    这是一个实现简单解决方案的源代码。

    import java.awt.BorderLayout;
    import java.util.Date;
    
    import javax.swing.BorderFactory;
    import javax.swing.JPanel;
    import javax.swing.JSlider;
    import javax.swing.border.Border;
    import javax.swing.event.ChangeEvent;
    import javax.swing.event.ChangeListener;
    
    import org.jfree.chart.ChartPanel;
    import org.jfree.chart.JFreeChart;
    import org.jfree.chart.axis.DateAxis;
    import org.jfree.chart.axis.NumberAxis;
    import org.jfree.chart.plot.XYPlot;
    import org.jfree.chart.renderer.xy.XYBarRenderer;
    import org.jfree.data.time.DateRange;
    import org.jfree.data.time.Day;
    import org.jfree.data.time.RegularTimePeriod;
    import org.jfree.data.time.TimeSeries;
    import org.jfree.data.time.TimeSeriesCollection;
    import org.jfree.ui.ApplicationFrame;
    import org.jfree.ui.RefineryUtilities;
    
    public class DomainTranslateDemo extends ApplicationFrame {
    
        private static class DemoPanel extends JPanel implements ChangeListener {
    
            private static int SLIDER_INITIAL_VALUE = 50;
            private JSlider slider;
            private DateAxis domainAxis;
            private int lastValue = SLIDER_INITIAL_VALUE;
    
            // one month (milliseconds, seconds, minutes, hours, days)
            private int delta = 1000 * 60 * 60 * 24 * 30;
    
            public DemoPanel() {
                super(new BorderLayout());
                JFreeChart chart = createChart();
                ChartPanel chartPanel = new ChartPanel(chart);
                chartPanel.setPreferredSize(new java.awt.Dimension(600, 270));
                chartPanel.setDomainZoomable(true);
                chartPanel.setRangeZoomable(true);
                Border border = BorderFactory.createCompoundBorder(
                    BorderFactory.createEmptyBorder(4, 4, 4, 4),
                    BorderFactory.createEtchedBorder()
                );
                chartPanel.setBorder(border);
                add(chartPanel);
    
                JPanel dashboard = new JPanel(new BorderLayout());
                dashboard.setBorder(BorderFactory.createEmptyBorder(0, 4, 4, 4));   
    
                this.slider = new JSlider(0, 100, SLIDER_INITIAL_VALUE);
                this.slider.addChangeListener(this);
                dashboard.add(this.slider);
                add(dashboard, BorderLayout.SOUTH);
            }
    
            private JFreeChart createChart() {
    
                TimeSeriesCollection timeSeriesCollection = new TimeSeriesCollection();
                TimeSeries series = createSerie(500,20);
                timeSeriesCollection.addSeries(series );
    
                this.domainAxis = new DateAxis("Time");
                NumberAxis rangeAxis = new NumberAxis("");
                XYBarRenderer renderer = new XYBarRenderer();
                renderer.setShadowVisible(false);
                XYPlot plot = new XYPlot(timeSeriesCollection, domainAxis, rangeAxis, renderer);
    
                JFreeChart chart = new JFreeChart(
                        "Title", 
                        JFreeChart.DEFAULT_TITLE_FONT,
                        plot, 
                        true);
                // performance
                chart.setAntiAlias(false);
                return chart;
            }
    
            private TimeSeries createSerie(int domainCount,int rangeCount) {
                TimeSeries timeSeries =  new TimeSeries("timeSeries1");
                Day d = new Day(new Date());
                RegularTimePeriod regularTimePeriod = d.next();
                for (int index = 0; index < domainCount; index++) {
                    if (index % 2 == 0) {
                        double value = (Math.random() * rangeCount);
                        timeSeries.add(regularTimePeriod,value);
                    }
                    regularTimePeriod = regularTimePeriod.next();
                }
                return timeSeries;
            }
    
            @Override
            public void stateChanged(ChangeEvent event) {
                int value = this.slider.getValue();
                long minimum = domainAxis.getMinimumDate().getTime();
                long maximum = domainAxis.getMaximumDate().getTime();
                if (value<lastValue) { // left
                    minimum = minimum - delta;
                    maximum = maximum - delta;
                } else { // right
                    minimum = minimum + delta;
                    maximum = maximum + delta;
                }
                DateRange range = new DateRange(minimum,maximum);
                domainAxis.setRange(range);
                lastValue = value;
            }
    
        }
    
        public DomainTranslateDemo(String title) {
            super(title);
            setContentPane(new DemoPanel());
        }
    
        public static JPanel createDemoPanel() {
            return new DemoPanel();
        }
    
        public static void main(String[] args) {
            DomainTranslateDemo demo = new DomainTranslateDemo("Translate Demo");
            demo.pack();
            RefineryUtilities.centerFrameOnScreen(demo);
            demo.setVisible(true);
        }
    
    } 
    

    【讨论】:

    • 嗨,您的代码使用 Jfreechart (Eclipse RCP) 在条形图中应用,,,任何想法和建议...快速告知...谢谢...
    • @BharatZala 应该,我已经 7 年没有使用这个 API 了。如果您能够使用此代码,请告诉我。
    【解决方案2】:

    TranslatingXYDataset 目前实现了XYDataset;相反,您需要按照JFreeChart.createXYBarChart 的要求实现IntervalXYDataset

    【讨论】:

    • 是的,你是对的。但是仍然无法正常工作:(。当我实现 IntervalXYDataset 而不是 XYDataset 时,我必须编写一些其他方法,例如:@Override public double getStartXValue(int series, int item) { return underlying.getStartXValue(series, item); } @ Override public double getEndXValue(int series, int item) { return underlying.getEndXValue(series, item); } 我不确定我应该对这些方法的主体做哪些额外的修改。
    • @Max:看起来JFreeChart.createXYBarChart 的默认渲染器XYBarRenderer 不高兴。 setShadowVisible(false) 有帮助吗?
    【解决方案3】:

    谢谢trashgod :D 但我放弃了这种方法。我需要在这里完成一些工作;)所以为了在图表上导航,我使用了不同的数据集org.jfree.data.time.DynamicTimeSeriesCollection

    本课程面向实时应用程序,在这些应用程序中,我们能够以非常快速的方式添加新数据并丢弃最旧的数据(取决于您的输入数据)。总之,每次有人滚动条时,我只需要更改我的基础数据集,这将触发 PlotChangeEvent,然后将其传递到图表并导致 ChartChangeEvent 被触发。

    此事件链用于确保在对图表的任何组件进行更改时自动更新图表。

    再次感谢您

    【讨论】:

    • 似乎是一个合理的选择,比演示更干净; +1。顺便说一句,您需要为除您之外的任何人使用@ 标签才能看到回复。
    • @trashgod:我找到了一个新的选择,再见。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    相关资源
    最近更新 更多