当前位置: 首页 > 知识库问答 >
问题:

JavaFX TreeView--在MouseEvent上更改同级节点的背景CSS

米裕
2023-03-14

我试图在JavaFX ListView上实现onMouseEnter和onMouseExit事件。我想做的是,如果鼠标移动到列表视图的节点上,我想更改当前视图中当前可见的子节点的背景色。

这篇文章有一个伟大的代码示例,但不是我正在寻找的。将样式应用于javaFX中的TreeView子节点

使用该代码作为参考,我要寻找的是一个给定的树:

共有1个答案

司马飞
2023-03-14

[更新注意:我最初有一个使用TreeItem子类的解决方案。这里提供的解决方案比原来的要干净得多。]

创建一个ObservableSet > ,其中包含应突出显示的TreeItem。然后在单元格工厂中,观察该集合和单元格的TreeItemProperty(),并设置样式类(在下面的示例中,我使用了pseudoclass),这样,如果属于该单元格的树项在集合中,则该单元格将被突出显示。

最后,向单元格注册MouseEntertMouseExited处理程序。当鼠标进入单元格时,您可以获得树项,使用它导航到您需要的任何其他树项,并将适当的项添加到您定义的集合中。在mouseexited处理程序中,清除集合(或根据需要执行其他逻辑)。

import java.util.HashSet;

import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.beans.binding.BooleanBinding;
import javafx.beans.value.ChangeListener;
import javafx.collections.FXCollections;
import javafx.collections.ObservableSet;
import javafx.css.PseudoClass;
import javafx.scene.Scene;
import javafx.scene.control.TreeCell;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class HighlightingTree extends Application {

    private final PseudoClass highlighted = PseudoClass.getPseudoClass("highlighted");

    @Override
    public void start(Stage primaryStage) {
        TreeView<Integer> tree = new TreeView<>();
        tree.setRoot(buildTreeRoot());

        ObservableSet<TreeItem<Integer>> highlightedItems = FXCollections.observableSet(new HashSet<>());


        tree.setCellFactory(tv -> {

            // the cell:
            TreeCell<Integer> cell = new TreeCell<Integer>() {

                // indicates whether the cell should be highlighted:

                private BooleanBinding highlightCell = Bindings.createBooleanBinding(() -> 
                    getTreeItem() != null && highlightedItems.contains(getTreeItem()), 
                    treeItemProperty(), highlightedItems);

                // listener for the binding above
                // note this has to be scoped to persist alongside the cell, as the binding
                // will use weak listeners, and we need to avoid the listener getting gc'd:
                private ChangeListener<Boolean> listener = (obs, wasHighlighted, isHighlighted) -> 
                    pseudoClassStateChanged(highlighted, isHighlighted);

                // anonymous constructor: register listener with binding    
                {
                    highlightCell.addListener(listener);
                }
            };

            // display correct text:
            cell.itemProperty().addListener((obs, oldItem, newItem) -> {
                if (newItem == null) {
                    cell.setText(null);
                } else {
                    cell.setText(newItem.toString());
                }
            });

            // mouse listeners:
            cell.setOnMouseEntered(e -> {
                if (cell.getTreeItem() != null) {
                    highlightedItems.add(cell.getTreeItem());
                    highlightedItems.addAll(cell.getTreeItem().getChildren());
                }
            });

            cell.setOnMouseExited(e -> highlightedItems.clear());

            return cell ;
        });

        BorderPane uiRoot = new BorderPane(tree);
        Scene scene = new Scene(uiRoot, 600, 600);
        scene.getStylesheets().add("highlight-tree-children.css");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    private TreeItem<Integer> buildTreeRoot() {
        return buildTreeItem(1);
    }

    private TreeItem<Integer> buildTreeItem(int n) {
        TreeItem<Integer> item = new TreeItem<>(n);
        if (n < 10_000) {
            for (int i = 0; i<10; i++) {
                item.getChildren().add(buildTreeItem(n * 10 + i));
            }
        }
        return item ;
    }


    public static void main(String[] args) {
        launch(args);
    }
}
.tree-cell:highlighted {
    -fx-background: yellow ;
}
 类似资料:
  • 问题内容: 我有一个Swing JButton,我的项目也使用了以下代码: 现在,当尝试使用一个按钮更改背景时,它不会变成红色,只有边框变成红色。 在仍用于其余组件/项目时,如何将背景变为红色? 问题答案: 看一下错误4880747:XP L&F:REGRESSION:JButton上的setBackground设置Windows XP中的边框颜色 。评估部分指出: 更改按钮的外观总是会导致与当前

  • 我在这里的要求是使我的孩子突出,而没有的白色背景-(因此AnchorPane需要透明),我如何实现这一点?

  • 我添加了一个表,但问题是,面板没有显示其背景色。我试过设置滚动窗格的背景色等,但它不起作用。框架有一个按钮“验证”,单击该按钮时,在其下方显示一个表。在单击之前,表格将显示的部分为纯灰色。我希望整个部分是象牙背景。请帮我诊断这个问题。

  • 我试图在基于swing的GUI中更改的背景。我已将该表添加到中。但是,表格中没有单元格的区域不会改变颜色。我尝试更改滚动窗格的背景色和前景色。然而,这也无济于事。我需要编辑JTable的哪个组件来更改白色背景。下面是我代码的一部分。 JTable的代码

  • 我在查看通知设计模式,没有发现任何关于通知图标背景的内容。正如您可能注意到的,自定义通知只有一个浅灰色背景。但是像Hangouts这样的应用程序,或者仅仅是USB调试通知,其通知图标的背景有一个自定义的颜色。 有没有可能把那灰色换成别的东西?(以编程方式指定圆颜色)

  • 我正在尝试使用JAVA(android Studio)创建一个简单的android应用程序。我愿意实现的是,应用程序的背景颜色将根据TextView的内容进行更改(在“打开”和“关闭”两个值之间不断更新)。我知道必须使用onChanged(),但我真的不知道如何实现TextView的侦听器。 我试着这样写:基于我在网上找到的内容,但无法真正了解下一步是什么。我完全是个新手,所以请善待我。 顺致敬意