Comment modifier / ouvrir la cellule exacte dans le tableau

voix
34

la table est FXML. Colonnes: Prénom, Nom, Téléphone, E-mail Je voudrais perfom clic de souris à la colonne e-mail afin de modifier Email exacte. Le code suivant fonctionne pas correctement, toujours e-mail ouvert à modifier, et non la cellule exacte

 table.setOnMouseClicked(new EventHandler<javafx.scene.input.MouseEvent>() {
Créé 22/03/2016 à 18:53
utilisateur
Dans d'autres langues...                            


2 réponses

voix
0

Voici un exemple simple de la façon de modifier une colonne dans une vue de tableau. Vous pouvez utiliser une colonne de champ de texte, ce qui permettra l'entrée de données lorsque vous cliquez dessus. Dans ce cas, seule la colonne e-mail est modifiable.

import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.TextFieldTableCell;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;


public class JavaFXApplication7 extends Application {

    @Override
    public void start(Stage primaryStage) {
        TableView<Person> tv = new TableView();
        TableColumn<Person, String> fCol = new TableColumn<>();
        TableColumn<Person, String> lCol = new TableColumn<>();
        TableColumn<Person, String> pCol = new TableColumn<>();
        TableColumn<Person, String> eCol = new TableColumn<>();

        tv.setEditable(true);
        tv.getColumns().addAll(fCol, lCol, pCol, eCol);

        fCol.setCellValueFactory(data -> data.getValue().firstName);
        lCol.setCellValueFactory(data -> data.getValue().lastName);
        pCol.setCellValueFactory(data -> data.getValue().phone);
        eCol.setCellValueFactory(data -> data.getValue().email);
        eCol.setCellFactory(tc -> new TextFieldTableCell<>());

        ObservableList<Person> items = FXCollections.observableArrayList();
        Person p = new Person();
        p.email.set("[email protected]");
        p.firstName.set("Tony");
        p.lastName.set("Stark");
        p.phone.set("(555) 555-1212");

        items.add(p);

        tv.setItems(items);

        StackPane root = new StackPane();
        root.getChildren().add(tv);

        Scene scene = new Scene(root, 300, 250);

        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }

    public class Person {
        StringProperty firstName = new SimpleStringProperty();
        StringProperty lastName = new SimpleStringProperty();
        StringProperty phone = new SimpleStringProperty();
        StringProperty email = new SimpleStringProperty();



    }

}
Créé 22/03/2016 à 19:20
source utilisateur

voix
0
table.setOnMouseClicked(new EventHandler<javafx.scene.input.MouseEvent>() {

définit le gestionnaire de clic pour toute la TableViewplace. De cette façon , vous ne pouvez pas distinguer entre les colonnes qui ont été cliqués.

Vous devez utiliser la fonction d'édition fournies par la TableCellplace:

// Simplified Person class
public class Person {

    private final StringProperty name;

    private final StringProperty email;

    public Person(String name, String email) {
        this.email = new SimpleStringProperty(email);
        this.name = new SimpleStringProperty(name);
    }

    public final String getEmail() {
        return this.email.get();
    }

    public final void setEmail(String value) {
        this.email.set(value);
    }

    public final StringProperty emailProperty() {
        return this.email;
    }

    public final String getName() {
        return this.name.get();
    }

    public final void setName(String value) {
        this.name.set(value);
    }

    public final StringProperty nameProperty() {
        return this.name;
    }

}
TableView<Person> table = new TableView<>(FXCollections.observableArrayList(
        new Person("Darth Vader", "[email protected]"),
        new Person("James Bond", "[email protected]")));
table.setEditable(true);

Callback<TableColumn<Person, String>, TableCell<Person, String>> cellFactory = col
        -> new TableCell<Person, String>() {

            {
                // make cell itself editable
                setEditable(true);
            }

            @Override
            public void startEdit() {
                super.startEdit();
                // open dialog for input when the user edits the cell
                TextInputDialog dialog = new TextInputDialog(getItem());
                dialog.setGraphic(null);
                dialog.setHeaderText("Set new " + col.getText() + ".");
                dialog.setTitle("Edit " + col.getText());
                Optional<String> opt = dialog.showAndWait();
                if (opt.isPresent()) {
                    commitEdit(opt.get());
                } else {
                    cancelEdit();
                }
            }

            @Override
            protected void updateItem(String item, boolean empty) {
                super.updateItem(item, empty);
                setText(empty ? null : item);
            }

        };

TableColumn<Person, String> name = new TableColumn<>("name");
name.setCellValueFactory(p -> p.getValue().nameProperty());
name.setCellFactory(cellFactory);

TableColumn<Person, String> email = new TableColumn<>("email");
email.setCellValueFactory(p -> p.getValue().emailProperty());
email.setCellFactory(cellFactory);

table.getColumns().addAll(name, email);
Créé 23/03/2016 à 08:36
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more