2010-10-19 13 views
6

Esto es similar a una pregunta que hice ayer pero más específica al problema. ¿Cuál es el método correcto para agregar un JFreeChart a un proyecto de NetBeans que ya contiene varios widgets? Mi updateChart() oculta el JFrame completo. Me gustaría agregar el JFreeChart al JFrame.Cómo mostrar un JFreeChart en un proyecto de NetBeans

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

código corregido:

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

Respuesta

8

Mi updateChart() oculta toda la JFrame.

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

Eso sería porque va a sustituir el panel de contenido de su marco con el panel de la carta libre.

No sé qué administrador de diseño está utilizando, pero debe "AGREGAR" el panel de gráfico libre al panel que contiene todos los demás componentes. Entonces, tal vez cuando diseñe la forma general en Netbeans, agregue un panel vacío al lugar donde desea que se agregue el panel gráfico gratuito. A continuación, cuando se agrega el panel de carta libre el código sería algo así como:

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

La validación dice swing que los componentes se han añadido por lo que se invocará el controlador de distribución.

+0

El NetBeans IDE parece estar utilizando un GroupLayout para el LayoutManager. Agregué un JPanel llamado jPanel1 al proyecto y 'jPanel1.add (chartPanel); jPanel1.getParent(). validate(); y jPanel1.setVisible (true); 'to' updateChart() 'pero el gráfico no está visible en jPanel1. ¿Alguna otra idea? – jacknad

+2

GroupLayout requiere el uso de restricciones de las que no sé nada. Supongo que el problema es que el panel vacío tiene un tamaño preferido de 0, por lo que las restricciones no se configuran correctamente para agregarle otro componente. Siempre construyo mis diseños de GUI a mano, así que tengo el control total del diseño. Así que mi sugerencia sería aprender cómo usar los administradores de diseño y hacer la codificación usted mismo, entonces usted no es dependiente del IDE. – camickr

+2

Gracias un millón por la pista. Todo lo que necesitaba era un 'chartPanel.setSize (jPanel1.getSize());'. – jacknad

Cuestiones relacionadas