如何在NetBeans项目中显示JFreeChart

6

这类似于我昨天问过的问题,但更具体地涉及到问题。 在已包含各种小部件的NetBeans项目中添加JFreeChart的正确方法是什么? 我的updateChart()隐藏了整个JFrame。 我想将JFreeChart添加到JFrame中。

public class MyClass extends javax.swing.JFrame implements TableModelListener {
    public MyClass() {
        initComponents();
        ...
        updateChart();
    }
    private void updateChart() {
        XYDataset dataset = createXYdataset();
        JFreeChart chart = createChart(dataset);
        JPanel chartPanel = new ChartPanel(chart);
        setContentPane(chartPanel);
    }
    private XYDataset createXYdataset() {
        XYSeries series = new XYSeries("");
        int rows = jTable.getRowCount();
        if (rows > 0) {
            int ms = 0;
            for (int row = 0; row < rows; row++) {
                series.add(ms, 1);
                ms += Integer.parseInt(
                        jTable.getValueAt(row, PULSE_ON).toString());
                series.add(ms, 1);
                series.add(ms, 0);
                ms += Integer.parseInt(
                        jTable.getValueAt(row, PULSE_OFF).toString());
                series.add(ms, 0);
            }
        }
        XYSeriesCollection dataset = new XYSeriesCollection();
        dataset.addSeries(series);
        return dataset;
    }
    private JFreeChart createChart(XYDataset dataset) {
        JFreeChart chart = ChartFactory.createXYLineChart(
            null,      // chart title
            "ms",                      // x axis label
            null,                      // y axis label
            dataset,                  // data
            PlotOrientation.VERTICAL,
            false,                     // include legend
            true,                     // tooltips
            false                     // urls
        );
        XYPlot plot = (XYPlot) chart.getPlot();
        plot.setDomainPannable(true);
        plot.setRangePannable(true);
        plot.setRangeGridlinesVisible(false);
        NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
        rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
        return chart;
    }
}

修正后的代码:

private void updateChart() {
    XYDataset dataset = createXYdataset();
    JFreeChart chart = createChart(dataset);
    JPanel chartPanel = new ChartPanel(chart);
    chartPanel.setSize(jPanel1.getSize());
    jPanel1.add(chartPanel);
    jPanel1.getParent().validate();
}
1个回答

8
我的updateChart()方法会隐藏整个JFrame窗口。
JFreeChart chart = createChart(dataset); 
JPanel chartPanel = new ChartPanel(chart); 
setContentPane(chartPanel); 

这是因为您正在使用free chart面板替换框架的内容窗格。我不知道您使用的布局管理器是什么,但是您需要将free chart面板“添加”到包含所有其他组件的面板中。因此,也许当您在Netbeans中设计一般表单时,您会在想要添加free chart面板的位置上添加一个空面板。然后,当您添加free chart面板时,代码应该类似于:
emptyFreeChartPanel.add( chartPanel );
emptyFreeChartPanel.getParent().validate();

验证告诉Swing已经添加了组件,因此布局管理器将被调用。

NetBeans IDE似乎使用GroupLayout作为LayoutManager。我在项目中添加了一个名为jPanel1的JPanel,并在updateChart()中添加了jPanel1.add(chartPanel); jPanel1.getParent().validate(); and jPanel1.setVisible(true);,但图表在jPanel1中不可见。还有其他想法吗? - jacknad
2
GroupLayout需要使用我不了解的约束条件。我猜问题在于空面板具有0个首选大小,因此约束条件未正确设置以添加另一个组件。我总是手动构建GUI布局,因此我完全控制布局。因此,我的建议是学习如何使用布局管理器并自己编写代码,这样您就不会依赖IDE。 - camickr
2
非常感谢这个提示。它只需要一个 chartPanel.setSize(jPanel1.getSize()); 就可以了。 - jacknad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接