2010-10-19 132 views
6

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

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

回答

8

我updateChart()隐藏整个 JFrame中。

JFreeChart chart = createChart(dataset); 
JPanel chartPanel = new ChartPanel(chart); 
setContentPane(chartPanel); 

那将是因为你从免费应用排行榜的面板更换你的帧的内容窗格中。

我不知道你在用什么布局管理器,但是你需要将免费图表面板“添加”到包含所有其他组件的面板。因此,也许当你在Netbeans中设计一般表格时,你会在你想要添加免费图表面板的地方添加一个空面板。然后,当你添加免费的图表面板的代码会是这样的:

emptyFreeChartPanel.add(chartPanel); 
emptyFreeChartPanel.getParent().validate(); 

的验证告诉摆动组件是否已加入这样的布局管理器将被调用。

+0

NetBeans IDE似乎在为LayoutManager使用GroupLayout。我在项目中添加了一个名为jPanel1的JPanel和'jPanel1.add(chartPanel); jPanel1.getParent()验证()。和jPanel1.setVisible(true);'updateChart()',但图表在jPanel1中不可见。任何其他想法? – jacknad 2010-10-19 15:56:34

+2

GroupLayout需要使用我一无所知的约束条件。我想问题是空的面板有一个0的首选大小,所以没有适当设置限制添加另一个组件。我总是手工构建我的GUI布局,所以我完全控制了布局。所以我的建议是学习如何使用布局管理器并自己完成编码,然后不依赖于IDE。 – camickr 2010-10-19 17:56:28

+2

非常感谢你的线索。它只需要一个'chartPanel.setSize(jPanel1.getSize());'。 – jacknad 2010-10-19 18:11:23