0

我有一个带有多个 TitledPanes 的手风琴。当 TitledPane 展开时,窗格上会出现没有子组件(例如,按钮、文本等)的“死区”。

现在,当我检查 MouseEvent.getSource() 时,它会返回所有区域的 TitledPane 实例。有没有办法专门限制/检查鼠标单击 TitledPane 的“标题”部分?

4

2 回答 2

0

在 css 参考中,您可以发现有一个TitledPane具有样式类的子项title。不难猜到这部分就是标题。您可以从拾取结果开始通过场景图,直到找到具有样式类的节点title或到达Accordion.

以下代码将Accordion绿色下方的矩形着色,如果鼠标在标题上,否则为红色:

@Override
public void start(Stage primaryStage) {
    TitledPane tp1 = new TitledPane("foo", new Rectangle(100, 100));
    TitledPane tp2 = new TitledPane("bar", new Circle(100));
    Accordion accordion = new Accordion(tp1, tp2);

    Rectangle rect = new Rectangle(100, 20, Color.RED);

    accordion.addEventFilter(MouseEvent.MOUSE_MOVED, evt -> {
        Node n = evt.getPickResult().getIntersectedNode();
        boolean title = false;
        while (n != accordion) {
            if (n.getStyleClass().contains("title")) {
                // we're in the title
                title = true;
                break;
            }
            n = n.getParent();
        }
        rect.setFill(title ? Color.LIME : Color.RED);
    });

    Scene scene = new Scene(new VBox(accordion, rect), 100, 400);

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

请注意MouseEvent.MOUSE_CLICKED,如果选择结果不在标题中,则使用事件过滤器可以简单地使用事件...

于 2016-12-21T11:26:28.653 回答
0

我不认为有一个公共 API 来检测标题区域上的鼠标点击,但是可以通过这种方式做到这一点:

titledPane.setOnMouseClicked(new EventHandler<MouseEvent>() {
    @Override
    public void handle(MouseEvent event) {
        EventTarget target = event.getTarget();
        String clazz = "class com.sun.javafx.scene.control.skin.TitledPaneSkin$TitleRegion";
        if(target.getClass().toString().equals(clazz) || // anywhere on title region except title Text
            (target instanceof Node && ((Node) target).getParent().getClass().toString().equals(clazz))) // title Text
            System.out.println("title was clicked");
    }
});

但是这种方法非常不鼓励使用,因为它依赖于一些可能会发生变化的内部实现细节。

可能最好多考虑一下您实际需要什么。也许您的实际需求可以通过 uisngTitledPane的公共 API 方法和属性来满足。

expandedProperty()因为每次鼠标点击标题区域时,insatnce的值都会改变(如果isCollapsible()设置为true)。

titledPane.expandedProperty().addListener(new ChangeListener<Boolean>() {
    @Override
    public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
        System.out.println("mouse click changed expanded from " + oldValue + " to " + newValue);
    }
});
于 2016-12-21T01:34:04.830 回答