如何检测“标签”中发生JavaFx鼠标事件的时间是TitledPane?

时间:2016-12-20 23:39:01

标签: javafx qmouseevent

我有一个带有多个TitledPanes的Accordian。当扩展TitledPane时,窗格上有“死区”,没有子组件(例如,按钮,文本等)。

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

2 个答案:

答案 0 :(得分:0)

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

TitledPane

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

考虑一下你真正需要的东西可能会更好。也许您的实际要求可以通过uisng expandedProperty()的公共API方法和属性来实现。

每次在标题区域发生鼠标点击时(isCollapsible()设置为true),{1}}的值都会发生变化。

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);
    }
});

答案 1 :(得分:0)

In the css reference您可以发现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的事件过滤器,如果选择结果不在标题中,您可以简单地使用该事件...