how to move between cells in a tableview of javafx?

0

What I deserve is to be able to move between the cells one by one by means of the keyboard only and be able to edit by pressing the enter key, so far I have only been able to do the editing when I clicked it with the mouse. package b.tablas;

 import ObjetosFx.CustomField;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.ObservableList;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
 import javafx.scene.input.KeyEvent;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;
import javafx.util.Callback;

/**
 *
 * @author JLAM
*/
public class BTablas extends Application {

private TableView<ProRutasE> tablaPrincipal = new TableView<>();
ObservableList<ProRutasE> tablaProRutasE;
private ColumnaRutas _ColRutas;

@Override
public void start(Stage stage) {

    Scene scene = new Scene(new Group());
    stage.setTitle("Table View ");
    stage.setWidth(1050);
    stage.setHeight(650);

    final Label label = new Label("Programacion Rutas");
    label.setFont(new Font("Calibri", 20));

    tablaPrincipal.setEditable(true);

    TableColumn noGuia = new TableColumn("No. de Guía");
    noGuia.setCellValueFactory(new PropertyValueFactory<>("noGuia"));
    noGuia.setStyle("-fx-alignment:center;");
    noGuia.setMinWidth(150);

    TableColumn dirDestino = new TableColumn("Direccion de Destino");
    dirDestino.setCellValueFactory(new PropertyValueFactory<>("dirDestino"));
    dirDestino.setStyle("-fx-alignment:center;");
    dirDestino.setMinWidth(200);

    TableColumn nomDestino = new TableColumn("Nombre del Destino");
    nomDestino.setCellValueFactory(new PropertyValueFactory<>("nomDestino"));
    nomDestino.setStyle("-fx-alignment:center;");
    nomDestino.setMinWidth(200);
    //creamos la columna a editar
    _ColRutas = new ColumnaRutas();
    _ColRutas.setMinWidth(150);

    //las demas columnas
    TableColumn nomRuta = new TableColumn("Nombre de la Ruta");
    nomRuta.setCellValueFactory(new PropertyValueFactory<>("nomRuta"));
    nomRuta.setStyle("-fx-alignment:center;");
    nomRuta.setMinWidth(200);

    TableColumn pesoRuta = new TableColumn("Peso");
    pesoRuta.setCellValueFactory(new PropertyValueFactory<>("peso"));
    pesoRuta.setStyle("-fx-alignment:center;");
    pesoRuta.setMinWidth(100);
    tablaPrincipal.setPrefSize(1000, 500);
    tablaPrincipal.getColumns().addAll(noGuia, dirDestino, nomDestino, _ColRutas, nomRuta, pesoRuta);

    tablaPrincipal.getItems().addAll(new ProRutasE("1", "Dir", "Destino 1", "R1", "Centro", "10.1"), new ProRutasE("2", "Dir", "Destino 2", "R2", "Centro", "10.1"), new ProRutasE("3", "Dir", "Destino 3", "R3", "Centro", "10.1"));
    final VBox vbox = new VBox();
    vbox.setSpacing(5);
    vbox.setPadding(new Insets(10, 0, 0, 10));
    vbox.getChildren().addAll(label, tablaPrincipal);

    ((Group) scene.getRoot()).getChildren().addAll(vbox);

    stage.setScene(scene);
    stage.show();
}

private class ColumnaRutas extends TableColumn<ProRutasE, String> {

    public ColumnaRutas() {
        super("Ruta");
        super.setStyle("-fx-alignment:center;");
        super.setPrefWidth(80);
        super.setSortable(false);
        super.setCellValueFactory(new PropertyValueFactory<ProRutasE, String>("ruta"));
        super.setCellFactory(new Callback<TableColumn<ProRutasE, String>, TableCell<ProRutasE, String>>() {
            @Override
            public TableCell<ProRutasE, String> call(TableColumn<ProRutasE, String> param) {
                return new CeldaEditableRutas();
            }
        });
        super.setOnEditCommit(new EventHandler<TableColumn.CellEditEvent<ProRutasE, String>>() {
            @Override
            public void handle(TableColumn.CellEditEvent<ProRutasE, String> t) {
                ((ProRutasE) t.getTableView().getItems()
                        .get(t.getTablePosition().getRow())).setnoGuia(t
                        .getNewValue());
            }
        });
    }

    private class CeldaEditableRutas extends TableCell<ProRutasE, String> {

        private CustomField textField;

        public CeldaEditableRutas() {
        }

        @Override
        public void startEdit() {
            if (!isEmpty()) {
                super.startEdit();
                createTextField();
                setText(null);
                setGraphic(textField);
                Platform.runLater(new Runnable() {
                    @Override
                    public void run() {
                        textField.requestFocus();
                        textField.selectAll();
                    }
                });
            }
        }

        @Override
        public void cancelEdit() {
            super.cancelEdit();
            setText(getString());
            setGraphic(null);

        }

        @Override
        public void updateItem(String item, boolean empty) {
            super.updateItem(item, empty);

            if (empty) {
                setText(null);
                setGraphic(null);
            } else if (isEditing()) {
                if (textField != null) {
                    textField.setText(getString());
                }
                setText(null);
                setGraphic(textField);
            } else {
                setText(getString());
                setGraphic(null);
            }
        }

        private void createTextField() {
            textField = new CustomField(getString());
            textField.setColorNormal("#3BAAE3");
            textField.setFormatoCampo(CustomField.FormatoTexto.ALFANUMERICO);
            textField.setMensajeAlerta("Solo valores Alfanumericos");
            textField.setMinWidth(this.getWidth() - this.getGraphicTextGap() * 2);

            textField.focusedProperty().addListener(new ChangeListener<Boolean>() {
                @Override
                public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
                    if (!newValue) {
                        editarRuta();
                    }
                }

            });

            textField.setOnKeyPressed(new EventHandler<KeyEvent>() {
                @Override
                public void handle(KeyEvent t) {
                    if (null != t.getCode()) {

                        switch (t.getCode()) {
                            case ENTER:
                                System.out.println("a presionado enter");
                                editarRuta();
                                break;
                            case ESCAPE:
                                cancelEdit();
                                //getTableView().edit(getTableRow().getIndex(),_ColRutas);
                                break;
                            case TAB:
                                getTableView().getSelectionModel().selectNext();
                                getTableView().edit(getTableRow().getIndex(), _ColRutas);
                                getTableView().getFocusModel().focus(getIndex() - 1);
                                getTableView().getSelectionModel().select(getIndex() - 1);

//
                                    break;                                 UP case:                                     getTableView (). edit (getTableRow (). getIndex (), _ColRutas);                                     getTableView (). getFocusModel (). focus (getIndex () - 1);                                     getTableView (). getSelectionModel (). select (getIndex () - 1);                                     getTableView (). getSelectionModel (). selectPrevious ();                                     break;                                 RIGHT case:

                                getTableView().getSelectionModel().selectPrevious();
                                break;
                            case DOWN:

                                getTableView().getSelectionModel().selectNext();
                            default:
                                break;
                        }
                    }
                }

            });
        }

        private void editarRuta() {
            System.out.println("metodo de editar rutas");

        }

        private String getString() {
            return getItem() == null ? "" : getItem().toString();
        }
    }
}

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

}

    
asked by Cristhian Pineda 16.04.2018 в 17:19
source

0 answers