Para editar / exacto de células abiertas en la tabla

votos
34

la mesa es fxml. Columnas: nombre, apellido, teléfono, correo electrónico Me gustaría perfom clic del ratón en la columna de correo electrónico con el fin de editar exacta de correo electrónico. El siguiente código no está funcionando correctamente, siempre correo electrónico abierto para editar, no exacto de células

 table.setOnMouseClicked(new EventHandler<javafx.scene.input.MouseEvent>() {
Publicado el 22/03/2016 a las 15:53
por usuario
En otros idiomas...                            


2 respuestas

votos
0

Aquí está un ejemplo sencillo de cómo editar una columna en una vista de tabla. Se puede utilizar una columna de campo de texto, lo que permitirá la entrada de datos cuando se hace clic en él. En este caso, sólo la columna de correo electrónico se puede editar.

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



    }

}
Respondida el 22/03/2016 a las 16:20
fuente por usuario

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

establece el controlador de clic para el conjunto TableViewen su lugar. De esta manera no se puede distinguir entre las columnas que se ha hecho clic.

Se debe utilizar la función de edición proporcionada por TableCellsu lugar:

// 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);
Respondida el 23/03/2016 a las 05:36
fuente por usuario

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