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 :

Rendre une colonne d'un TableView editable


Sujet :

JavaFX

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2010
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 36
    Points : 21
    Points
    21
    Par défaut Rendre une colonne d'un TableView editable
    Bonjour a tous,

    J'ai un tableView alimenté et j'aimerais rendre un de ses champs modifiable.

    J'ai modifié le FXML :
    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
    <?xml version="1.0" encoding="UTF-8"?>
     
    <?import java.lang.*?>
    <?import javafx.scene.control.*?>
    <?import javafx.scene.layout.*?>
    <?import javafx.scene.layout.AnchorPane?>
     
    <AnchorPane prefHeight="299.0" prefWidth="309.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="liste.Liste1Controller">
      <children>
        <TableView fx:id="tableView2" editable="true" prefHeight="400.0" prefWidth="600.0" AnchorPane.bottomAnchor="10.0" AnchorPane.leftAnchor="10.0" AnchorPane.rightAnchor="10.0" AnchorPane.topAnchor="10.0">
          <columns>
            <TableColumn prefWidth="75.0" text="Numero" fx:id="Index" />
            <TableColumn editable="true" prefWidth="75.0" text="Type" fx:id="Type" />
            <TableColumn prefWidth="75.0" text="Categorie" fx:id="Categorie" />
            <TableColumn prefWidth="75.0" text="Nom" fx:id="Nom" />
          </columns>
        </TableView>
      </children>
    </AnchorPane>
    pour ajouter editable="true" sur le table view et la colonne.

    J'ai modifié le Controller, mais la zone reste non modifiable.

    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
    package liste;
     
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    import bean.Liste;
    import bean.Type;
    import fxmltableview.FxmlListe;
    import javafx.beans.property.SimpleStringProperty;
    import javafx.beans.value.ObservableValue;
    import javafx.collections.ObservableList;
    import javafx.event.ActionEvent;
    import javafx.event.EventHandler;
    import javafx.fxml.FXML;
    import javafx.scene.control.MenuBar;
    import javafx.scene.control.TableColumn;
    import javafx.scene.control.TableColumn.CellDataFeatures;
    import javafx.scene.control.TableView;
    import javafx.scene.control.cell.PropertyValueFactory;
    import javafx.scene.control.cell.TextFieldTableCell;
    import javafx.util.Callback;
     
    import menu.MenuManager;
     
    /**
     * FXML Controller class
     *
     * @author Ordi
     */
    public class Liste1Controller {
     
        @FXML
        private TableView<Type> tableView2;
        @FXML
        private TableColumn<Type, Integer> Index;
        @FXML
        private TableColumn<Type, String> Type;
        @FXML
        private TableColumn<Type, String> Categorie;
        @FXML
        private TableColumn<Type, String> Nom;
     
        private MenuManager menu;
     
        //private ObservableList<Liste> personData = FXCollections.observableArrayList();
        /**
         * The constructor. The constructor is called before the initialize()
         * method.
         */
        public Liste1Controller() {
     
        }
     
        /**
         * Initializes the controller class.
         */
        @FXML
        public void initialize() {
            tableView2.setEditable(true);
            Index.setCellValueFactory(new PropertyValueFactory<Type, Integer>("Index"));
            Type.setCellValueFactory(new Callback<CellDataFeatures<Type, String>, ObservableValue<String>>() {
                public ObservableValue<String> call(CellDataFeatures<Type, String> p) {
                    return new SimpleStringProperty(p.getValue().getType());
                }
            });
            //Type.setCellValueFactory(new PropertyValueFactory<Type, String>("Type"));
            Categorie.setCellValueFactory(new PropertyValueFactory<Type, String>("Categorie"));
            Nom.setCellValueFactory(new PropertyValueFactory<Type, String>("Nom"));
     
        }
     
        public void initManager(final MenuManager menuManager) {
            this.menu = menuManager;
        }
     
        public void setMainApp(ObservableList<Type> mainApp) {
     
            // Add observable list data to the table
            tableView2.setItems(mainApp);
        }
     
        @FXML
        private void handleAboutQuit(final ActionEvent event) {
            System.exit(0);
        }
     
        public final void setOnEditCommit(EventHandler<TableColumn.CellEditEvent<Type, String>> value) {
     
        }
     
    }
    Je cherche pas encore à récupérer et stocker la nouvelle valeur, mais pour l'instant juste à cliquer sur un champs de la colonne Type pour la modifier.

    Qu'ai-je loupé?

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Bonjour,
    la TableCell mise par défaut dans une TableView ne supporte pas le mode édition (bien que disposant de toute l'infrastructure nécessaire pour y arriver dans son code).
    Essaie de mettre une TextFieldTableCell dans la colonne a la place.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myTableColumn.setCellFactory(TextFieldTableCell.forTableColumn());
    J'ai un article en préparation sur ça mais il n'est pas encore finalisé.
    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 à l'essai
    Inscrit en
    Mai 2010
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 36
    Points : 21
    Points
    21
    Par défaut
    Bonjour Bouye et merci pour tout l'investissement dont tu fais preuve sur ce domaine.

    J'ai fait la modification mais j'ai un problème de mapping :
    incompatible types: Callback<TableColumn<Object,String>,TableCell<Object,String>> cannot be converted to Callback<TableColumn<Type,String>,TableCell<Type,String>>

    J'ai modifié la définition de la zone de private TableColumn<Type, String> Type; en private TableColumn<Object, String> Type;

    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
    package liste;
     
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    import bean.Liste;
    import bean.Type;
    import fxmltableview.FxmlListe;
    import javafx.beans.property.SimpleStringProperty;
    import javafx.beans.value.ObservableValue;
    import javafx.collections.ObservableList;
    import javafx.event.ActionEvent;
    import javafx.event.EventHandler;
    import javafx.fxml.FXML;
    import javafx.scene.control.MenuBar;
    import javafx.scene.control.TableColumn;
    import javafx.scene.control.TableColumn.CellDataFeatures;
    import javafx.scene.control.TableView;
    import javafx.scene.control.cell.PropertyValueFactory;
    import javafx.scene.control.cell.TextFieldTableCell;
    import javafx.util.Callback;
     
    import menu.MenuManager;
     
    /**
     * FXML Controller class
     *
     * @author Ordi
     */
    public class Liste1Controller {
     
        @FXML
        private TableView<Type> tableView2;
        @FXML
        private TableColumn<Type, Integer> Index;
        @FXML
        private TableColumn<Object, String> Type;
        @FXML
        private TableColumn<Type, String> Categorie;
        @FXML
        private TableColumn<Type, String> Nom;
     
        private MenuManager menu;
     
        //private ObservableList<Liste> personData = FXCollections.observableArrayList();
        /**
         * The constructor. The constructor is called before the initialize()
         * method.
         */
        public Liste1Controller() {
     
        }
     
        /**
         * Initializes the controller class.
         */
        @FXML
        public void initialize() {
            tableView2.setEditable(true);
            Index.setCellValueFactory(new PropertyValueFactory<Type, Integer>("Index"));
            Type.setCellFactory(TextFieldTableCell.forTableColumn());
            /*Type.setCellValueFactory(new Callback<CellDataFeatures<Type, String>, ObservableValue<String>>() {
                public ObservableValue<String> call(CellDataFeatures<Type, String> p) {
                    return new SimpleStringProperty(p.getValue().getType());
                }
            });*/
            //Type.setCellValueFactory(new PropertyValueFactory<Type, String>("Type"));
            Categorie.setCellValueFactory(new PropertyValueFactory<Type, String>("Categorie"));
            Nom.setCellValueFactory(new PropertyValueFactory<Type, String>("Nom"));
     
        }
     
        public void initManager(final MenuManager menuManager) {
            this.menu = menuManager;
        }
     
        public void setMainApp(ObservableList<Type> mainApp) {
     
            // Add observable list data to the table
            tableView2.setItems(mainApp);
        }
     
        @FXML
        private void handleAboutQuit(final ActionEvent event) {
            System.exit(0);
        }
     
        public final void setOnEditCommit(EventHandler<TableColumn.CellEditEvent<Type, String>> value) {
     
        }
     
    }
    La zone est bien devenue modifiable mais elle ne contient plus ma données. Ce qui parait normal vu que le mapping sur la zone n'est plus là.

    je retest ce midi avec un mapping:

    Type.setCellFactory((Callback<TableColumn<Object, String>, TableCell<Object, String>>) TextFieldTableCell.forTableColumn().call(Type));

  4. #4
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    C'est une méthode statique générique ! (faut penser à lire la doc)
    Essaie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myTableColumn.setCellFactory(TextFieldTableCell.<String>forTableColumn());
    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

  5. #5
    Membre à l'essai
    Inscrit en
    Mai 2010
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 36
    Points : 21
    Points
    21
    Par défaut
    C'est impeccable Bouye. Merci pour ton aide.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @FXML
        public void initialize() {
            tableView2.setEditable(true);
            Index.setCellValueFactory( new PropertyValueFactory<Type, Integer>("Index"));
            Type.setCellValueFactory(new PropertyValueFactory<Type, String>("Type"));
            Type.setCellFactory(TextFieldTableCell.<Type>forTableColumn());
            Categorie.setCellValueFactory(new PropertyValueFactory<Type, String>("Categorie"));
            Nom.setCellValueFactory(new PropertyValueFactory<Type, String>("Nom"));
     
        }
    Ps: Quand je serai grand je serai Bouye

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Rendre une colonne d'une DBGrid éditable
    Par einstein7955 dans le forum Delphi
    Réponses: 14
    Dernier message: 21/06/2017, 10h53
  2. Comment rendre une colonne de datagridview editable?
    Par NoussaL dans le forum Windows Forms
    Réponses: 4
    Dernier message: 22/10/2008, 12h13
  3. [JTable] Rendre une colonne non éditable
    Par d_hazem dans le forum Composants
    Réponses: 2
    Dernier message: 04/06/2008, 10h48
  4. [VB.NET 2005] ListView : Rendre une colonne invisible
    Par rafou28 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 11/08/2006, 15h05
  5. FlexGrid: Rendre une colonne active
    Par Terminator dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 13/10/2005, 10h07

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