IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaFX Discussion :

Exception java.lang.ClassCastException dans JavaFX (TableColumn->TableColumn$CellDataFeatures)


Sujet :

JavaFX

  1. #1
    Membre habitué
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Avril 2023
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Suisse

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2023
    Messages : 7
    Par défaut Exception java.lang.ClassCastException dans JavaFX (TableColumn->TableColumn$CellDataFeatures)
    Je développe une application pour apprendre les bibliothèques JavaFX. Je cherche à afficher une TableView dans un BorderLayout.
    J'utilise Netbeans IDE 22, avec le jdk 22 et JavaFX 23.

    Quelqu'un peut-il m'expliquer comment la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TableColumn col.setCellValueFactory(
                new PropertyValueFactory<Line, Double>("tauxDeNatalite"))
    passe de la classe TableColumn à la classe TableColumn$CellDataFeatures en passant par la classe PropertyValueFactory ? Ou comment afficher des données dans un TableView?
    Je suis l'exemple 12-6 du site : https://docs.oracle.com/javafx/2/ui_...table-view.htm pour afficher une TableView et j'arrive à afficher une table vide, mais j'obtient une erreur l'erreur de cast suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Exception in thread "JavaFX Application Thread" java.lang.ClassCastException: class javafx.scene.control.TableColumn cannot be cast to class javafx.scene.control.TableColumn$CellDataFeatures (javafx.scene.control.TableColumn and javafx.scene.control.TableColumn$CellDataFeatures are in module javafx.controls@23.0.1 of loader 'platform')
    	at javafx.controls/javafx.scene.control.cell.PropertyValueFactory.call(PropertyValueFactory.java:132)...
    qui se déclanche lorsque j'execute le code suivant :
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    TableColumn colTauxSucide = new TableColumn<Event, Double>(columnName[1]);
    colTauxSucide.setMinWidth(100);
    colTauxSucide.setCellValueFactory(
                    new PropertyValueFactory<Line, Double>("tauxSucide"));
    ...

    Quelqu'un peut-il m'expliquer ce qui déclanche cette exception ?

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 899
    Billets dans le blog
    54
    Par défaut
    C'est toujours mieux avec un exemple simple et reproductible. Du coup, comme j'ai pas les details de ton code ou de ton objet Line, ma réponse reste généraliste.

    Cette ligne sert a extraire les données directement depuis ton bean ou ton objet FX sans créer de dépendance forte dans le code, a l'instar de certains frameworks JavaScript.

    Tu trouveras dans l'exemple suivant la manière de procéder suivant comment on accede a des valeurs contenues dans un objet simple (ici un record mais ca importe peu), un bean Java standard ou un objet avec des propriétés FX. Le nom de la propriété a extraire est donc écrite sous forme de chaîne de texte "<nom>" plutôt que dans du code. Suivant comment est fait ton objet, Java va donc chercher un getter "get<Nom>()" ou un accesseur de propriété "<nom>Property()" via introspection pour trouver la valeur (la classe doit donc être accessible via introspection, et les méthodes publiques aussi il me semble -peux me tromper-). Voir la doc.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    package test.tablecell;
     
    import javafx.application.Application;
    import javafx.application.Platform;
    import javafx.beans.property.DoubleProperty;
    import javafx.beans.property.SimpleDoubleProperty;
    import javafx.beans.property.SimpleObjectProperty;
    import javafx.scene.Scene;
    import javafx.scene.control.SplitPane;
    import javafx.scene.control.TableColumn;
    import javafx.scene.control.TableView;
    import javafx.scene.control.cell.PropertyValueFactory;
    import javafx.stage.Stage;
     
    import java.util.stream.IntStream;
     
    public final class Main extends Application {
        public static void main(final String... args) {
            launch(args);
        }
     
        @Override
        public void start(Stage stage) throws Exception {
            // Record.
            final var birthColumn1 = new TableColumn<LineRecord, Double>("Taux de natalité (record)");
            birthColumn1.setMinWidth(100);
            birthColumn1.setCellValueFactory(feature -> {
                final double value = feature.getValue().birth;
                return new SimpleObjectProperty<Double>(value);
            });
            final var suicideColumn1 = new TableColumn<LineRecord, Double>("Taux de suicide (record)");
            suicideColumn1.setMinWidth(100);
            suicideColumn1.setCellValueFactory(feature -> {
                final double value = feature.getValue().suicide;
                return new SimpleObjectProperty<Double>(value);
            });
            final var tableView1 = new TableView<LineRecord>();
            tableView1.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY_ALL_COLUMNS);
            tableView1.getColumns().setAll(birthColumn1, suicideColumn1);
            tableView1.setEditable(false);
            // Bean Properties.
            final var birthColumn2 = new TableColumn<LineBean, Double>("Taux de natalité (bean)");
            birthColumn2.setMinWidth(100);
            birthColumn2.setCellValueFactory(new PropertyValueFactory<LineBean, Double>("birth"));
            final var suicideColumn2 = new TableColumn<LineBean, Double>("Taux de suicide (bean)");
            suicideColumn2.setMinWidth(100);
            suicideColumn2.setCellValueFactory(new PropertyValueFactory<LineBean, Double>("suicide"));
            final var tableView2 = new TableView<LineBean>();
            tableView2.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY_ALL_COLUMNS);
            tableView2.getColumns().setAll(birthColumn2, suicideColumn2);
            tableView2.setEditable(false);
            // FX Properties.
            final var birthColumn3 = new TableColumn<LineFX, Double>("Taux de natalité (FX)");
            birthColumn3.setMinWidth(100);
            birthColumn3.setCellValueFactory(new PropertyValueFactory<LineFX, Double>("birth"));
            final var suicideColumn3 = new TableColumn<LineFX, Double>("Taux de suicide (FX)");
            suicideColumn3.setMinWidth(100);
            suicideColumn3.setCellValueFactory(new PropertyValueFactory<LineFX, Double>("suicide"));
            final var tableView3 = new TableView<LineFX>();
            tableView3.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY_ALL_COLUMNS);
            tableView3.getColumns().setAll(birthColumn3, suicideColumn3);
            tableView3.setEditable(false);
            // Data.
            IntStream.range(0, 100)
                    .forEach(index -> {
                        double birth = Math.random();
                        double suicide = Math.random();
                        final var record = new LineRecord(birth, suicide);
                        final var objBean = new LineBean(birth, suicide);
                        final var objFX = new LineFX(birth, suicide);
                        tableView1.getItems().add(record);
                        tableView2.getItems().add(objBean);
                        tableView3.getItems().add(objFX);
                    });
            final var root = new SplitPane();
            root.getItems().setAll(tableView1, tableView2, tableView3);
            final var scene = new Scene(root);
            stage.setTitle("Test");
            stage.setWidth(1200);
            stage.setHeight(600);
            stage.setScene(scene);
            stage.show();
            Platform.runLater(() -> root.setDividerPositions(0.33, 0.66));
        }
     
        private record LineRecord(double birth, double suicide) {
        }
     
        public static class LineBean {
            private double birth;
            private double suicide;
     
            public LineBean(double birth, double suicide) {
                this.birth = birth;
                this.suicide = suicide;
            }
     
            public double getBirth() {
                return birth;
            }
     
            public void setBirth(final double value) {
                birth = value;
            }
     
            public double getSuicide() {
                return suicide;
            }
     
            public void setSuicide(final double value) {
                suicide = value;
            }
        }
     
     
        public static class LineFX {
            private final DoubleProperty birthProperty = new SimpleDoubleProperty(this, "birth");
            private final DoubleProperty suicideProperty = new SimpleDoubleProperty(this, "suicide");
     
            public LineFX(double birth, double suicide) {
                setBirth(birth);
                setSuicide(suicide);
            }
     
            public double getBirth() {
                return birthProperty.get();
            }
     
            public void setBirth(final double value) {
                birthProperty.set(value);
            }
     
            public DoubleProperty birthProperty() {
                return birthProperty;
            }
     
            public double getSuicide() {
                return suicideProperty.get();
            }
     
            public void setSuicide(final double value) {
                suicideProperty.set(value);
            }
     
            public DoubleProperty suicideProperty() {
                return suicideProperty;
            }
        }
    }
    Je rappelle aussi (parce que le nom porte a confusion) :
    • CellValueFactory - concerne l’extraction de la valeur depuis le modèle (la liste d'objets items qui est contenue dans la TableView) ;
    • CellFactory - concerne la presentation de la cellule (la valeur a déjà été extraite a ce moment-la).


    EDIT - il y a un soucis de type dans la declaration de ta colonne et de son extracteur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TableColumn colTauxSucide = new TableColumn<Event, Double>(columnName[1]);
    colTauxSucide.setCellValueFactory(new PropertyValueFactory<Line, Double>("tauxSucide"));
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Membre habitué
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Avril 2023
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Suisse

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2023
    Messages : 7
    Par défaut Réponse problème de cast pour une TableView et TableColumn
    Merci beaucoup pour cet exemple très claire. Grâce à lui, j'ai réussit à finir mon projet.

Discussions similaires

  1. [Jena] Exception java.lang.ClassCastException
    Par may.sou dans le forum Frameworks
    Réponses: 5
    Dernier message: 22/05/2012, 13h50
  2. Réponses: 2
    Dernier message: 24/02/2009, 13h24
  3. Exception java.lang.ClassCastException: java.lang.Long save
    Par *alexandre* dans le forum Hibernate
    Réponses: 3
    Dernier message: 07/02/2009, 10h05
  4. Réponses: 1
    Dernier message: 23/01/2009, 15h07
  5. [DOM] java.lang.ClassCastException dans un code qui modifie un fichier XML
    Par RouRa22 dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 21/12/2007, 16h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo