【问题标题】:Freechart insert into a panelFreechart 插入面板
【发布时间】:2014-07-30 13:41:01
【问题描述】:

我只想将图表(由Graphique 类创建)插入另一个类(此处为“TabFrame”)的面板中。我正在使用 NetBeans。所以,我创建了一个类Graphique,如您所见:

public class Graphique extends JPanel {
        public Graphique(double cpm1, int temps1, double cpm2,
        double temps2, double cpm3, double temps3, double cpm4,
        double temps4) {
    final XYDataset dataset = createDataset(cpm1, temps1,
            cpm2, temps2, cpm3, temps4, cpm4,
            temps4);
    final JFreeChart chart = createChart(dataset);
    final ChartPanel chartPanel = new ChartPanel(chart);
    chartPanel.setPreferredSize(new java.awt.Dimension(500, 270));
    add(chartPanel);

    final XYPlot plot = chart.getXYPlot();
    plot.setBackgroundPaint(Color.lightGray);

    plot.setDomainGridlinePaint(Color.white);
    plot.setRangeGridlinePaint(Color.white);

    final XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer();
    renderer.setSeriesLinesVisible(1, false);
    renderer.setSeriesShapesVisible(1, false);
    plot.setRenderer(renderer);

}

public XYDataset createDataset(double cpm1, int temps1, double cpm2,
        double temps2, double cpm3, double temps3, double cpm4,
        double temps4) {
    final XYSeries series1 = new XYSeries("log cpm net");
    series1.add(temps1, cpm1);
    series1.add(temps2, cpm2);
    series1.add(temps3, cpm3);
    series1.add(temps4, cpm4);
    final XYSeriesCollection dataset = new XYSeriesCollection();
    dataset.addSeries(series1);
    return dataset;

}

private JFreeChart createChart(final XYDataset dataset) {
    final JFreeChart chart = ChartFactory.createXYLineChart("log Chart", // chart
                                                                            // title
            "temps", // x axis label
            "log CPM", // y axis label
            dataset, // data
            PlotOrientation.VERTICAL, true, // include legend
            true, // tooltips
            false // urls
            );
    return chart;

    }

}

下一步是将 Graphique 类创建的图表集成到另一个名为 TabFrame 的类中的面板(由于 netbeans 的 GUI 界面已经声明):

  JPanel cp = new Graphique(Math.log(CMP1corBis), tempsCumule1, Math.log(CMP2corBis),
          tempsCumule2,Math.log(CMP3corBis), tempsCumule3,Math.log(CMP4corBis), tempsCumule4);
  PanelGraphique1.add(cp);

为什么这不起作用?

【问题讨论】:

  • PanelGraphique1 是什么?

标签: java netbeans jfreechart


【解决方案1】:

您没有为Graphique 面板指定LayoutManager,因此当您将ChartPanel 添加为子组件时,它很可能不会被定位或调整大小,因此您不会看到任何图表.

【讨论】:

  • JPanel的默认布局是FlowLayout;更多here.
  • 是的,你是对的(似乎 JavaScript 让我的大脑变得迟钝了)。最可能的问题是 JFreeChart 的 ChartPanel 类没有首选大小,因此它需要一个布局管理器来定位和调整它的大小(例如 BorderLayout)。在您的示例代码中,您通过覆盖 getPreferredSize() 直接提供大小。我可能应该更改 JFreeChart 代码,为 ChartPanel 设置一些默认大小,以避免这种情况发生。
  • ChartPanel 构造函数根据合理的默认值调用setPreferredSize();我不确定我是否会提倡改变任何东西。更多here.
  • 你又是对的。您对 JFreeChart(和其他)问题的支持令人惊叹!
  • 是的,我是粉丝!欢迎批评性的 cmets。冒着看似坚持不懈的风险,我对这个question 感到不知所措,也看到了here
【解决方案2】:

使用替代数据,您的图表如下所示;问题可能出在您提供的参数中或忽略了pack() 封闭的Window。顺便说一句,考虑覆盖getPreferredSize(),原因是here

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

/**
 * @see https://stackoverflow.com/a/25047904/230513
 */
public class Test {

    private class Graphique extends JPanel {

        public Graphique() {
            final XYDataset dataset = createDataset();
            final JFreeChart chart = createChart(dataset);
            final ChartPanel chartPanel = new ChartPanel(chart){

                @Override
                public Dimension getPreferredSize() {
                    return new Dimension(500, 270);
                }
            };
            add(chartPanel);

            final XYPlot plot = chart.getXYPlot();
            plot.setBackgroundPaint(Color.lightGray);

            plot.setDomainGridlinePaint(Color.white);
            plot.setRangeGridlinePaint(Color.white);

            final XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer();
            renderer.setSeriesLinesVisible(1, false);
            renderer.setSeriesShapesVisible(1, false);
            plot.setRenderer(renderer);
        }

        private XYDataset createDataset() {
            final XYSeries series1 = new XYSeries("log cpm net");
            series1.add(1, 10);
            series1.add(2, 20);
            series1.add(3, 30);
            series1.add(4, 40);
            final XYSeriesCollection dataset = new XYSeriesCollection();
            dataset.addSeries(series1);
            return dataset;
        }

        private JFreeChart createChart(final XYDataset dataset) {
            final JFreeChart chart = ChartFactory.createXYLineChart("log Chart",
                    "temps", // x axis label
                    "log CPM", // y axis label
                    dataset, // data
                    PlotOrientation.VERTICAL, true, // include legend
                    true, // tooltips
                    false // urls
            );
            return chart;
        }

    }

    private void display() {
        JFrame f = new JFrame("Test");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(new Graphique());
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(() -> {
            new Test().display();
        });
    }
}

【讨论】:

  • 经过反思,PanelGraphique1 可能会被另一个面板遮盖或替换。让我知道这个独立示例是否按预期工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-18
相关资源
最近更新 更多