Ich möchte das Klick-Verhalten des TreeTableView
ändern, aber ehrlich gesagt bin ich mir nicht sicher, wie die beabsichtigte Vorgehensweise aussehen muss oder ob es überhaupt so sein soll verändert in irgendeiner Weise.Wie man Klick-Verhalten von TreeTableView ändert
Die meisten Benutzer beschwerten sich, das aktuelle Verhalten wäre nicht konsistent. Manchmal kollabiert/erweitert ein Klick auf eine Zelle das Baumelement, manchmal wird ein Doppelklick benötigt. Dies zusammen mit dem Initialisieren des Bearbeitungsmodus kann ein Schmerz sein. Also würde ich gerne selbst mit dem Klick-Verhalten umgehen.
Ich war in der Lage, das Verhalten bis in die TreeTableCellBehavior
Klasse zu verengen:
@Override
protected void handleClicks(MouseButton button, int clickCount, boolean isAlreadySelected) {
// handle editing, which only occurs with the primary mouse button
TreeItem<S> treeItem = getControl().getTreeTableRow().getTreeItem();
if (button == MouseButton.PRIMARY) {
if (clickCount == 1 && isAlreadySelected) {
edit(getControl());
} else if (clickCount == 1) {
// cancel editing
edit(null);
} else if (clickCount == 2 && treeItem.isLeaf()) {
// attempt to edit
edit(getControl());
} else if (clickCount % 2 == 0) {
// try to expand/collapse branch tree item
treeItem.setExpanded(! treeItem.isExpanded());
}
}
}
Unfortunatly einen Haken oder etwas zu ändern, um diese Art von Verhalten zu erstellen Ich habe keine Möglichkeiten zu sehen. Da Verhaltensklassen und Skins interne Klassen sind, sehe ich keine Möglichkeit, mein eigenes Verhalten zu erstellen. Hat also jemand eine Idee, an welcher Stelle von TreeTableView ich mich einklinken sollte, um das Klickverhalten von zu ändern?
Edit: Es scheint der Code geändert, seit ich den Code veröffentlicht. Also habe ich diese Frage aktualisiert. Ich habe auch Teile des öffentlichen API-Zugriffs gefunden, konnte aber immer noch nicht herausfinden, wie man das Klickverhalten überschreibt. Kann mir jemand irgendwelche Hinweise geben?
Edit2: Aufgrund Brians Kommentar habe ich ein kleines Beispiel erstellt und es mit der Benutzererfahrung Dokumentation verglichen. Es funktionierte wie beschrieben (=> "Knoten können durch Klicken auf die" Turner "-Symbole oder durch Doppelklick auf den Knotennamen geöffnet werden (beachten Sie, dass bei aktivierter Bearbeitung Doppelklick in den Bearbeitungsmodus geht)."), Bis ich mich änderte die TreeColumn der TreeTableView zu einer anderen Spalte als die erste Spalte (was der einzige Unterschied zwischen meinem Projekt und dem Beispielcode war). Das Ändern der Spalte führt zu dem merkwürdigen Verhalten: Der Turner reagiert nicht mehr auf einzelne Mausklicks und manchmal (kaum passiert) ist die Auswahl nicht korrekt eingestellt, stattdessen wird der Knoten expandiert/kollabiert.
Ich habe ein kleines Beispiel, das Problem zu demonstrieren:
public class TreeTableViewTurnerIssueExample extends Application
{
@Override
public void start(final Stage primaryStage)
{
TreeItem<Item> root = new TreeItem<>(new Item("Root", "Root"));
TreeItem<Item> item1 = new TreeItem<>(new Item("1", "Item1"));
TreeItem<Item> item2 = new TreeItem<>(new Item("2", "Item2"));
TreeItem<Item> item3 = new TreeItem<>(new Item("3", "Item3"));
TreeItem<Item> item4 = new TreeItem<>(new Item("4", "Item4"));
TreeItem<Item> item41 = new TreeItem<>(new Item("4.1", "Item41"));
TreeItem<Item> item42 = new TreeItem<>(new Item("4.2", "Item42"));
TreeItem<Item> item43 = new TreeItem<>(new Item("4.3", "Item43"));
TreeItem<Item> item5 = new TreeItem<>(new Item("5", "Item5"));
TreeItem<Item> item52 = new TreeItem<>(new Item("5.1", "Item51"));
root.getChildren().add(item1);
item1.getChildren().add(item2);
root.getChildren().add(item3);
item3.getChildren().add(item4);
item4.getChildren().add(item41);
item4.getChildren().add(item42);
item4.getChildren().add(item43);
root.getChildren().add(item5);
item5.getChildren().add(item52);
TreeTableColumn<Item, String> nameColumn = new TreeTableColumn<>("Name");
TreeTableColumn<Item, String> valueColumn = new TreeTableColumn<>("Value");
nameColumn.setCellValueFactory(new TreeItemPropertyValueFactory<Item, String>("name"));
valueColumn.setCellValueFactory(new TreeItemPropertyValueFactory<Item, String>("value"));
final TreeTableView<Item> treeTableView = new TreeTableView<>(root);
treeTableView.getColumns().add(nameColumn);
treeTableView.getColumns().add(valueColumn);
treeTableView.setTreeColumn(valueColumn);//<- changing this to the first column, the clickbehavior is fine.
treeTableView.setShowRoot(false);
treeTableView.setColumnResizePolicy(TreeTableView.CONSTRAINED_RESIZE_POLICY);
BorderPane layout = new BorderPane();
layout.setCenter(treeTableView);
Scene scene = new Scene(layout, 400, 400);
scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(final String[] args)
{
launch(args);
}
}
public class Item
{
private final StringProperty name = new SimpleStringProperty();
private final StringProperty value = new SimpleStringProperty();
public Item(final String name, final String value)
{
this.name.set(name);
this.value.set(value);
}
public String getName()
{
return name.get();
}
public void setName(final String name)
{
this.name.set(name);
}
public StringProperty nameProperty()
{
return name;
}
public String getValue()
{
return value.get();
}
public void setValue(final String value)
{
this.value.set(value);
}
public StringProperty valueProperty()
{
return value;
}
}
Ich habe auch ein Jira Ticket, da ich das denke, ist in der Tat ein Problem, es sei denn, jemand mich auf jeden Fehler hinweisen kann ich in diesem Beispiel gemacht.
Haben Sie gesehen, wie es funktionieren soll? [link.] (https://wikis.oracle.com/display/OpenJDK/TreeTableView+User+Experience+Documentation) Ich hatte ähnliche Probleme mit den Schlüsselereignissen für Dinge wie alle erweitern oder die Branche. Ich habe Ereignisfilter verwendet und diese anschließend verbraucht. – brian
@brian, danke für deinen Hinweis mit der Dokumentation.Es ergab einige interessante Untersuchungen und ich aktualisierte die Frage mit meinen neuen Erkenntnissen. – crusam