gpt4 book ai didi

java - 为什么默认情况下按钮鼠标事件处理程序会消耗一个事件?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:45:15 27 4
gpt4 key购买 nike

感谢您对我上一篇文章(也是我的第一篇文章)的帮助。我是 stackoverflow 的新手。我希望我早点加入这个小组。这里的人都非常有礼貌,乐于助人。

无论如何,我一直致力于更好地理解 javafx 事件。对于你们中的某些人来说,这似乎是另一个简单或“愚蠢”的问题。 为什么默认情况下按钮鼠标事件处理程序似乎会消耗一个事件?

来自 the oracle documents ,在页面底部,它声明“请注意,JavaFX UI 控件的默认处理程序通常会消耗大部分输入事件。”它是附加到我不知道的按钮的默认处理程序吗?为什么我必须明确在目标节点触发事件才能使其在事件调度链中冒泡?

如有任何回应,我们将不胜感激! :)

public class MouseEventTest extends Application {

@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("Hello World");

Group root = new Group();

Scene scene = new Scene(root, 300, 250);

Button btn = new Button();
btn.setText("Hello World");
btn.setPrefSize(100, 100);


BorderPane layout = new BorderPane(btn);
layout.setPrefSize(300, 250);

root.getChildren().add(layout);

//This is the event dispatch chain
//primaryStage -> scene -> root -> layout -> btn (capturing phrase)
//btn -> layout -> root -> scene -> primaryStage (bubbling phrase)
btn.setOnMousePressed(e -> {
System.out.println("btn mouse pressed...");
//Why do I need to fire the mouse pressed event
//in order for the event to bubble up the chain?
//It seems like by default that the button setOnMousePressed event hanlder
//has consumed the event. Am I right?
//layout.fireEvent(e);
});

layout.setOnMousePressed(e -> { System.out.println("layout mouse pressed...");});
root.setOnMousePressed(e -> { System.out.println("root mouse pressed...");});
scene.setOnMousePressed(e -> { System.out.println("scene mouse pressed...");});

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

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}

}

最佳答案

默认按钮外观实现调用 consumeMouseEvents(true) .如果您不希望出现这种行为,请覆盖默认皮肤并将值设置为 false。

btn.setSkin(new ButtonSkin(btn) {
{
this.consumeMouseEvents(false);
}
});

然后单击示例应用程序按钮的输出将是:

btn mouse pressed...
layout mouse pressed...
root mouse pressed...
scene mouse pressed...

为什么会这样,我说不上来。我的猜测是,如果皮肤使用事件,那么这有助于防止鼠标事件从控件中发生不必要的传播,例如当它们彼此分层或堆叠时。这可能是您几乎所有时间都想要的行为,因此可以做出明智的默认设置。

关于java - 为什么默认情况下按钮鼠标事件处理程序会消耗一个事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41132015/

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