gpt4 book ai didi

java - 在 TreeTableView 中选择子项时还要选择父项直至根

转载 作者:行者123 更新时间:2023-12-02 12:04:20 25 4
gpt4 key购买 nike

我们努力实现以下目标:

当在 JavaFX TreeTableView 中选择一个节点时,还应该选择“根路径”,即父节点、祖父节点等。在这种情况下选择意味着用不同的背景颜色突出显示,请参见图像(在示例中,用户单击了级别 2 上的节点)。

enter image description here

有没有内置函数可以实现这一点?我们尝试使用 CSS 但没有成功。

最佳答案

没有“内置函数”可以执行此操作。在树 TableView 上使用行工厂来创建观察所选项目的行,并相应地在该行上设置伪类。

例如:

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import javafx.application.Application;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.css.PseudoClass;
import javafx.scene.Scene;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeTableColumn;
import javafx.scene.control.TreeTableRow;
import javafx.scene.control.TreeTableView;
import javafx.stage.Stage;

public class TreeTableViewHighlightSelectionPath extends Application {

@Override
public void start(Stage primaryStage) {
TreeTableView<Item> table = new TreeTableView<Item>();

PseudoClass ancestorOfSelection = PseudoClass.getPseudoClass("ancestor-of-selection");

table.setRowFactory(ttv -> new TreeTableRow<Item>() {

{
table.getSelectionModel().selectedItemProperty().addListener(
(obs, oldSelection, newSelection) -> updateStyleClass());
}
@Override
protected void updateItem(Item item, boolean empty) {
super.updateItem(item, empty);
updateStyleClass();
}

private void updateStyleClass() {
pseudoClassStateChanged(ancestorOfSelection, false);
TreeItem<Item> treeItem = table.getSelectionModel().getSelectedItem();
if (treeItem != null) {
for (TreeItem<Item> parent = treeItem.getParent() ; parent != null ; parent = parent.getParent()) {
if (parent == getTreeItem()) {
pseudoClassStateChanged(ancestorOfSelection, true);
break ;
}
}
}
}
});

TreeTableColumn<Item, String> itemCol = new TreeTableColumn<>("Item");
itemCol.setCellValueFactory(cellData -> new SimpleStringProperty(cellData.getValue().getValue().getName()));
table.getColumns().add(itemCol);

TreeTableColumn<Item, Number> valueCol = new TreeTableColumn<>("Value");
valueCol.setCellValueFactory(cellData -> cellData.getValue().getValue().valueProperty());
table.getColumns().add(valueCol);

table.setRoot(createRandomTree());

Scene scene = new Scene(table);
scene.getStylesheets().add("style.css");
primaryStage.setScene(scene);
primaryStage.show();
}

private TreeItem<Item> createRandomTree() {
TreeItem<Item> root = new TreeItem<>(new Item("Item 1", 0));
Random rng = new Random();
List<TreeItem<Item>> items = new ArrayList<>();
items.add(root);

for (int i = 2 ; i <= 20 ; i++) {
TreeItem<Item> item = new TreeItem<>(new Item("Item "+i, rng.nextInt(1000)));
items.get(rng.nextInt(items.size())).getChildren().add(item);
items.add(item);
}

return root ;
}

public static class Item {
private final String name ;
private final IntegerProperty value = new SimpleIntegerProperty();

public Item(String name, int value) {
this.name = name ;
setValue(value);
}

public String getName() {
return name ;
}

public IntegerProperty valueProperty() {
return value ;
}

public final int getValue() {
return valueProperty().get();
}

public final void setValue(int value) {
valueProperty().set(value);
}
}

public static void main(String[] args) {
launch(args);
}
}

现在您可以在 CSS 中设置“选定节点的祖先”的样式:

文件样式.css:

.tree-table-row-cell:ancestor-of-selection {
-fx-background: -fx-selection-bar;
-fx-table-cell-border-color: derive(-fx-selection-bar, 20%);
}

(您可能希望修改 CSS 以获得更好的控制,例如为非焦点表中的选定行设置不同的颜色等。有关默认样式的详细信息,请参阅 default stylesheet。)

这是上述测试应用程序的屏幕截图:

enter image description here

关于java - 在 TreeTableView 中选择子项时还要选择父项直至根,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47016160/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com