2010-10-19 24 views
6

Ceci est similaire à une question que j'ai posée hier mais plus spécifique au problème. Quelle est la méthode correcte pour ajouter un JFreeChart à un projet NetBeans qui contient déjà divers widgets? Mon updateChart() masque le JFrame entier. Je voudrais ajouter le JFreeChart au JFrame.Comment afficher un JFreeChart dans un projet 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; 
    } 
} 

code corrigé:

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

Répondre

8

Mon updateChart() cache l'ensemble JFrame.

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

Ce serait parce que vous remplacez le volet contenu de votre cadre avec le panneau de tableau libre.

Je ne sais pas quel gestionnaire de disposition vous utilisez, mais vous devez "AJOUTER" le panneau graphique libre au panneau qui contient tous les autres composants. Alors peut-être que lorsque vous concevez le formulaire général dans Netbeans, vous ajoutez un panneau vide à l'endroit où vous voulez que le panneau graphique gratuit soit ajouté. Ensuite, lorsque vous ajoutez le panneau graphique libre le code serait quelque chose comme:

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

Le validate indique Balancez que les composants ont été ajoutés afin que le gestionnaire de mise en page sera invoquée.

+0

L'EDI NetBeans semble utiliser un GroupLayout pour LayoutManager. J'ai ajouté un JPanel appelé jPanel1 au projet et 'jPanel1.add (chartPanel); jPanel1.getParent(). validate(); et jPanel1.setVisible (true); 'à' updateChart() 'mais le graphique n'est pas visible dans jPanel1. D'autres idées? – jacknad

+2

GroupLayout nécessite l'utilisation de contraintes dont je ne sais rien. Je suppose que le problème est que le panneau vide a une taille préférée de 0, de sorte que les contraintes ne sont pas définies correctement pour y ajouter un autre composant. Je construis toujours mes mises en page GUI à la main, donc je suis en plein contrôle de la mise en page. Donc, ma suggestion serait d'apprendre à utiliser les gestionnaires de disposition et de faire le codage vous-même alors vous n'êtes pas dépendant de l'IDE. – camickr

+2

Merci un million pour l'indice. Tout ce dont il avait besoin était un 'chartPanel.setSize (jPanel1.getSize());'. – jacknad