JavaFX TreeView Edit Mode über F2

Robat

Top Contributor
Ja indem du der TreeView einen OnKeyPressed-EventListener verpasst:
(Solltest du keine eigene Klasse für die TreeView verwenden kannst du den Converter natürlich weglassen :)
Java:
public class CustomTreeViewTest extends Application {
    @Override
    public void start( Stage primaryStage ) throws Exception {

        TreeItem<Node> rootItem = new TreeItem<>(new Node("Autos"));
        rootItem.getChildren().addAll(getSampleData());

        TreeView<Node> treeView = new TreeView<>(rootItem);
        
        // falls du es mit Doppelklick gar nicht editieren möchtest, dann diese Zeile einkommentieren
        // treeView.setEditable(false);
        
        treeView.setOnKeyPressed(event -> {
            System.out.println(event.getCode());
            if(event.getCode() == KeyCode.F2) {
                TreeItem<Node> selectedItem = treeView.getSelectionModel().getSelectedItem();
                treeView.setEditable(true);
                treeView.edit(selectedItem);
            }
        });
        
        final StringConverter<Node> converter = new StringConverter<>() {
            @Override
            public String toString( Node object ) {
                return object.getValue();
            }

            @Override
            public Node fromString( String string ) {
                return new Node(string);
            }
        };
        
        treeView.setCellFactory(tv -> TextFieldTreeCell.forTreeView(converter).call(tv));
        

        primaryStage.setScene(new Scene(treeView, 400, 400));
        primaryStage.show();
    }
}
 

lam_tr

Top Contributor
Vielen Dank Robert.

Kann ich irgendwie auch auf das Textfeld zugreifen und fokusieren wenn der Mode aktiviert ist?

Zum Beispiel an der Stelle

Code:
treeView.setOnKeyPressed(event -> {
            System.out.println(event.getCode());
            if(event.getCode() == KeyCode.F2) {
                TreeItem<Node> selectedItem = treeView.getSelectionModel().getSelectedItem();
                treeView.setEditable(true);
                treeView.edit(selectedItem);

                // Textfeld Focus request
            }
        });

Ich frage deswegen, weil in mein Code muss ich immer noch separat in das Textfeld klicken damit ich editieren kann.
 

Robat

Top Contributor
Ich frage deswegen, weil in mein Code muss ich immer noch separat in das Textfeld klicken damit ich editieren kann.
Das kann ich nicht nachvollziehen / reproduzieren. Das Textfeld wird bei mir direkt selektiert und der gesamte Text darin markiert sodass ich einfach schreiben kann. Kannst du das an einem kurzen Beispiel reproduzieren?
 

lam_tr

Top Contributor
Das kann ich nicht nachvollziehen / reproduzieren. Das Textfeld wird bei mir direkt selektiert und der gesamte Text darin markiert sodass ich einfach schreiben kann. Kannst du das an einem kurzen Beispiel reproduzieren?

Ich benutze das EMF.edit Framework um das Editieren von EObjects automatisch zu supporten. An der Stelle wenn ich Doppelklicke, wird erst das Textfeld aktiv und beim erneutes anklicken wird erst das Textfeld fokusiert.

Ich bin noch nicht tief in den Code von EMF.edit eingetrungen, aber ich vermute mal, dass es zu viel macht (Drag&Drop, Cell Editing, Undo/Redo) und dann das erwartete nicht mehr macht.

Das mit dem Zugriff auf dem Textfeld wäre einen Workaround für mich gewesen, ich wüsste nur nicht wie ich dahin kommen soll.
 

Robat

Top Contributor
Mit dem EMF.edit Framework habe ich noch nie gearbeitet und kannte es bis dato auch gar nicht.

An das Textfield zu kommen könnte etwas "hacky" werden.
Java:
treeView.setOnKeyPressed(event -> {
    if (event.getCode() == KeyCode.F2) {
        TreeItem<Node> selectedItem = treeView.getSelectionModel().getSelectedItem();
        treeView.setEditable(true);
        treeView.edit(selectedItem);

        List<javafx.scene.Node> cells = new ArrayList<>(treeView.lookupAll(".tree-cell"));

        int row = treeView.getRow(selectedItem);
        TreeCell cell = ((TreeCell) cells.get(row));

        TextField textfield = (TextField) cell.getGraphic();
        textfield.requestFocus();
        textfield.selectAll();
    }
});
Ob das funktioniert kann ich dir aber nicht sagen, weil ich noch weniger Ahnung von dem Framework habe als du ;)
 

lam_tr

Top Contributor
Mit dem EMF.edit Framework habe ich noch nie gearbeitet und kannte es bis dato auch gar nicht.

An das Textfield zu kommen könnte etwas "hacky" werden.
Java:
treeView.setOnKeyPressed(event -> {
    if (event.getCode() == KeyCode.F2) {
        TreeItem<Node> selectedItem = treeView.getSelectionModel().getSelectedItem();
        treeView.setEditable(true);
        treeView.edit(selectedItem);

        List<javafx.scene.Node> cells = new ArrayList<>(treeView.lookupAll(".tree-cell"));

        int row = treeView.getRow(selectedItem);
        TreeCell cell = ((TreeCell) cells.get(row));

        TextField textfield = (TextField) cell.getGraphic();
        textfield.requestFocus();
        textfield.selectAll();
    }
});
Ob das funktioniert kann ich dir aber nicht sagen, weil ich noch weniger Ahnung von dem Framework habe als du ;)

Grad getestet, funktioniert super. Und der obere Code funktioniert ohne EMF prima, nur mit dem Framework muss man so viel drum rum bauen, leider.

Eine Unschönheit hätte ich noch, wenn das alles eingegeben ist, will ich mit Enter das Textfeld schließen.

Ich habe das so gemacht, was ist da falsch?

Code:
        treeView.setOnKeyPressed(event -> {
            if (event.getCode() == KeyCode.F2) {
                TreeItem<Object> selectedItem = treeView.getSelectionModel().getSelectedItem();
                treeView.setEditable(true);
                treeView.edit(selectedItem);

                List<javafx.scene.Node> cells = new ArrayList<>(treeView.lookupAll(".tree-cell"));

                int row = treeView.getRow(selectedItem);
                TreeCell cell = ((TreeCell) cells.get(row));

                TextField textfield = (TextField) cell.getGraphic();
                textfield.setOnKeyPressed(e->{
                    if (e.getCode() == KeyCode.ENTER) {
                       
                        //treeView.setEditable(false);
                       
                        //cell.commitEdit(textfield.getText());
                    }
                });
                textfield.requestFocus();
                textfield.selectAll();
            }
        });

Danke Robert.

Aktuell kann ich es nur verlassen wenn ich auf Tabulator drücke.
 

Robat

Top Contributor
Das kommt jetzt ein bisschen drauf an was deine TreeView für Elemente enthält.
Wenn wir mein Beispiel von oben aufgreifen muss es so aussehen
Java:
textfield.setOnKeyPressed(e-> {
    if(e.getCode() == KeyCode.ENTER) {
        cell.commitEdit(new Node(textfield.getText()));
    }
});

EDIT:
Aus TreeCell muss noch TreeCell<Node> werden bzw eben dein Datentyp der TreeView
 
Zuletzt bearbeitet:

lam_tr

Top Contributor
Das kommt jetzt ein bisschen drauf an was deine TreeView für Elemente enthält.
Wenn wir mein Beispiel von oben aufgreifen muss es so aussehen
Java:
textfield.setOnKeyPressed(e-> {
    if(e.getCode() == KeyCode.ENTER) {
        cell.commitEdit(new Node(textfield.getText()));
    }
});

EDIT:
Aus TreeCell muss noch TreeCell<Node> werden bzw eben dein Datentyp der TreeView

Anscheinend muss ich nicht das Ergebnis des Textfeldes explzit irgendwie weitergeben
Code:
        treeView.setOnKeyPressed(event -> {
            if (event.getCode() == KeyCode.F2) {
                TreeItem<Object> selectedItem = treeView.getSelectionModel().getSelectedItem();
                treeView.setEditable(true);
                treeView.edit(selectedItem);

                List<javafx.scene.Node> cells = new ArrayList<>(treeView.lookupAll(".tree-cell"));

                int row = treeView.getRow(selectedItem);
                TreeCell cell = ((TreeCell) cells.get(row));

                TextField textfield = (TextField) cell.getGraphic();
                textfield.setOnKeyPressed(e->{
                    if (e.getCode() == KeyCode.ENTER) {
                        cell.commitEdit(selectedItem.getValue());
                    }
                });
                textfield.requestFocus();
                textfield.selectAll();
            }
        });

Das hier hat vollkommen ausgereicht.

Vielen Dank nochmal.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M JavaFX TreeView - TreeItem - SelectedItem AWT, Swing, JavaFX & SWT 7
W JavaFX JavaFX - TreeView will nicht AWT, Swing, JavaFX & SWT 8
ProggersWorld JavaFX Icons im TreeView werden nicht angezeigt AWT, Swing, JavaFX & SWT 1
L JavaFX TreeView aufstellen läuft irgendwie auf Endlosschleife AWT, Swing, JavaFX & SWT 3
ralfb1105 JavaFX TreeView dynamisch aus Datenbank Tabelle erstellen AWT, Swing, JavaFX & SWT 22
B JavaFx TreeView mit file system AWT, Swing, JavaFX & SWT 1
D JavaFX TreeView stylen AWT, Swing, JavaFX & SWT 6
L JavaFX TreeView mit File Objects AWT, Swing, JavaFX & SWT 0
P TreeView automatisch an große von Inhalt anpassen AWT, Swing, JavaFX & SWT 3
P X extends TreeView - eigene Methoden AWT, Swing, JavaFX & SWT 5
I JavaFX Im TreeView, TreeItems sortieren AWT, Swing, JavaFX & SWT 3
B TreeView cellFactory AWT, Swing, JavaFX & SWT 4
D javafx.scene.control.TreeView als dropdown Menü AWT, Swing, JavaFX & SWT 6
K JavaFX Mehrere Cell Editors in einem TreeView Item AWT, Swing, JavaFX & SWT 2
I JavaFX TreeView Pfeil nicht mehr Klickbar machen AWT, Swing, JavaFX & SWT 1
B JavaFX Wie Treeview aus xml erzeugen AWT, Swing, JavaFX & SWT 11
B Convert Treeview to XML AWT, Swing, JavaFX & SWT 9
N JavaFX TreeView mit verschiedenen Datentypen AWT, Swing, JavaFX & SWT 8
C SWT Treeview mit Bilder im Label verändert Expanded Icon AWT, Swing, JavaFX & SWT 1
agent47 JavaFX TreeView Struktur dynamisch einlesen AWT, Swing, JavaFX & SWT 1
Tom299 JavaFX TreeView Expanded-Icon ändern AWT, Swing, JavaFX & SWT 0
ToBJo JavaFX TreeView zerstört sich selbst AWT, Swing, JavaFX & SWT 1
G JavaFX TreeView stylen AWT, Swing, JavaFX & SWT 2
G JavaFX TreeView AWT, Swing, JavaFX & SWT 3
G Problem mit TreeView AWT, Swing, JavaFX & SWT 2
L TreeViewerColumn - gesamte TreeView-breite nutzen? AWT, Swing, JavaFX & SWT 5
T SWT Treeview größe ändern AWT, Swing, JavaFX & SWT 2
C SWT Error/Warnings in TreeView AWT, Swing, JavaFX & SWT 2
P Eindeutiger Knoten im Treeview AWT, Swing, JavaFX & SWT 3
K SystemIcons v. Dateien & Verz. im TreeView anzeigen AWT, Swing, JavaFX & SWT 2
C JavaFX Edit TableView in Verbindung mit SceneBuilder AWT, Swing, JavaFX & SWT 1
J SWT SWT - edit eines TreeNodes AWT, Swing, JavaFX & SWT 4
Y DatenEvents in JTable bei User-Edit AWT, Swing, JavaFX & SWT 2
C Swing JTable: edit Cell -> versteckten Wert ändern AWT, Swing, JavaFX & SWT 12
D JTable während edit kein update machen lassen AWT, Swing, JavaFX & SWT 2
O JTable Edit cell edit end erzwingen... AWT, Swing, JavaFX & SWT 7
M Swing [gelöst] JTable: Edit abstellen AWT, Swing, JavaFX & SWT 3
F JTable Java 1.6 Filtering TableRows EDIT(!) AWT, Swing, JavaFX & SWT 2
D JSpinner ohne Edit Möglichkeit AWT, Swing, JavaFX & SWT 5
R JTable, automatisch im Edit Modus AWT, Swing, JavaFX & SWT 2
L JavaFX OpenJFX im Debug Mode starten AWT, Swing, JavaFX & SWT 8
G AWT Full-Screen Exclusive Mode AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben