Comment mettre à jour un graphique à secteurs dans Swing avec l'exception de point Null de l'applet JavaFX intégrée


Je travaille sur ma dernière tâche de programmation pour l'école et je voulais ajouter un petit bonbon fonctionnel à mon application java, sous la forme d'un camembert dynamique dans JavaFX.

En utilisant Netbeans 7.2 rc2, j'ai créé une application hybride swing/javafx à partir des modèles. J'ai étendu la JPanelClass pour créer un shell avec lequel mon application principale pourrait utiliser pour accéder aux fonctionnalités FX. Le problème auquel je suis confronté, cependant, est que si l'initialisation du graphique se passe bien, lorsque J'essaie de mettre à jour la chose dynamitée, elle génère une exception de pointeur Null. Ici, je crois est le code pertinent:

Instanciation:

public class PieChartJFxPanel extends JApplet {

  private static final int JFXPANEL_WIDTH_INT = 500;
  private static final int JFXPANEL_HEIGHT_INT = 500;

    StackPane root = new StackPane();
    PieChart athleteChart;
    ObservableList<PieChart.Data> pieChartData =FXCollections.observableArrayList();
    private static JFXPanel fxContainer;
    private int fAthletes=0;
    private int rAthletes=0;

   public PieChartJFxPanel(int totalAthletes,int finishedAthletes){
    super();
    fAthletes=finishedAthletes;
    rAthletes=totalAthletes-fAthletes;
}

@Override
public void init() {
    fxContainer = new JFXPanel();
    fxContainer.setPreferredSize(new Dimension(JFXPANEL_WIDTH_INT, JFXPANEL_HEIGHT_INT));                    
    add(fxContainer, BorderLayout.CENTER);
    // create JavaFX scene
    Platform.runLater(new Runnable() {
        @Override
        public void run() {
            createScene();
        }
    });
}

Le constructeur de scène:

private void createScene() {     
    pieChartData.add(new PieChart.Data("Finished",fAthletes));
    pieChartData.add(new PieChart.Data("Outstanding",rAthletes));               
    athleteChart=new PieChart();     
    athleteChart.setLegendVisible(false);
   athleteChart.setTitle("Race Status");
   //athleteChart.setAnimated(true);       
    athleteChart.setData(pieChartData);               

    root.getChildren().add(athleteChart);
    fxContainer.setScene(new Scene(root));        
    //


}

Et la méthode qui a généré l'exception:

public void setData(int total, int in){
    final  ObservableList<PieChart.Data> pieChartDat=FXCollections.observableArrayList();
    pieChartDat.add(new PieChart.Data("Finished",fAthletes));
    pieChartDat.add(new PieChart.Data("Outstanding",rAthletes));  
    athleteChart.setData(pieChartDat);                
}

Et l'exception:

Exception in thread "main" java.lang.NullPointerException
     at piechartjpanel.PieChartJFxPanel.setData(PieChartJFxPanel.java:95)
     at piechartjpanel.AthleteIOChart.setAthletes(AthleteIOChart.java:62)
     at piechartjpanel.Test.setter(Test.java:34)
     at piechartjpanel.Test.main(Test.java:48)

Toute aide est appréciée :) Merci d'avance

Author: RabtFt, 2012-07-19

2 answers

Vous n'initialisez jamais atheleteChart

athleteChart.setData(pieChartDat);

athleteChart est null quand on l'appelle, et le sera toujours.

, Soit l'initialiser dans le constructeur ou simplement changer de PieChart atheleteChart = new PieChart();

 1
Author: Rob Wagner, 2012-07-18 21:24:17

J'ai découvert que parce que JavaFX utilise des objets comme modèle de données, chaque fois que le paramètre d'un objet est modifié, le graphique se met automatiquement à jour, donc dans l'exemple que j'ai posté ci-dessus pour changer les valeurs du pieChart, tout ce dont j'avais besoin était quelque chose de similaire à ce qui suit:

pieChartData.get(index).setValues(blah,blah);

J'ai trouvé que les composants Swing ont également l'habitude de le faire, en utilisant des objets comme types de données dynamiques, en changeant automatiquement pour refléter l'apparence pour refléter les valeurs changeantes. Je suis surprises ne repéré ceci, peut-être que j'ai mal formulé ma question. Merci À Tous.

 0
Author: RabtFt, 2012-09-09 20:27:38