JavaFX - 将事件处理程序添加到舞台的标题栏

时间:2017-07-19 14:40:48

标签: java javafx event-handling addeventlistener stage

我正在尝试将事件处理程序添加到舞台的标题栏,但它不起作用。

我试过用这个:

primaryStage.addEVentHandler(MouseEvent.MOUSE_PRESSED, (event)->{
     System.out.println("ok");
});

但它只将事件注册到场景区域,并且不会读取标题栏上的鼠标按下事件。

有没有办法在舞台的标题栏上听鼠标事件?

完整代码:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.HBox;
import javafx.scene.text.Text;
import javafx.stage.Stage;

public class demo extends Application {

    @Override
    public void start(final Stage primaryStage) {
        HBox box = new HBox();
        Scene scene = new Scene(box, 350, 250);

        Text text = new Text("Test");
        box.getChildren().add(text);

        primaryStage.addEventHandler(MouseEvent.MOUSE_PRESSED,(event) -> {
            System.out.println("ok");
        });
        primaryStage.setScene(scene);
        primaryStage.setTitle("TimePicker");
        primaryStage.show();
    }

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

2 个答案:

答案 0 :(得分:0)

据我所知,这是不可能的,因为用户期望与底层操作系统确定的标题栏交互产生某种行为。如果您开始在标题栏上处理鼠标事件,则可能会干扰此预期行为。

这就是说,通过设置primaryStage.initStyle(StageStyle.UNDECORATED);隐藏标题栏,就可以实现自己的标题栏,提供自定义行为。

答案 1 :(得分:0)

我无法弄清楚如何使用系统默认标题栏执行任何操作。它不是一个节点,它不会在负坐标空间中响应。

可能的解决方法:创建自己的标题栏!

制作主舞台并将其设置为StageStyle.UNDECORATED。

使用像BorderPane这样的根窗格在顶部开发自己的标题栏。

请参阅此link以使UNDECORATED阶段可拖动(基本上拖动BorderPane的顶部)。

祝你好运!