簡體   English   中英

javafx在APPLICATION_MODAL階段用函數替換阻塞聲音

[英]javafx replace blocking sound with a function in a APPLICATION_MODAL stage

我創建了一個小View並將它們放到舞台上。 我設置了階段APPLICATION_MODAL:

stage.initModality(Modality.APPLICATION_MODAL);

如果單擊呼叫窗口,則會出現阻塞聲。 所以這是正確的行動。 但是,是否有可能用自己的功能替換此阻塞聲音? 如果要單擊調用窗口,我想關閉新的階段,但是我真的嘗試了所有想到的事情,甚至Event.EventFilter也行不通:

    stage.addEventFilter(Event.ANY, new EventHandler<Event>() {

        @Override
        public void handle(Event event) {
            System.out.println("Event catched: "+event);
        }
    });

有什么方法可以處理在調用窗口上的單擊?

當您將某些內容設置為APPLICATION_MODAL ,可以防止任何事件被調度到ANY窗口。 這意味着您的事件監聽器沒有用。 這是文檔所說的:

APPLICATION_MODAL
定義一個模式窗口,該窗口阻止事件傳遞到任何其他應用程序窗口。

我的建議是,當您的自定義視圖可見時,並且在父窗口中單擊時可見時,禁用所有組件,然后關閉視圖。 這將解決顯式設置模態的問題(無論如何都不會傳遞事件)。

SSCCE:

package stack;

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.SceneBuilder;
import javafx.scene.control.TextField;
import javafx.scene.control.TextFieldBuilder;
import javafx.scene.effect.Reflection;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.text.Text;
import javafx.scene.text.TextBuilder;
import javafx.stage.Modality;
import javafx.stage.Popup;
import javafx.stage.Stage;
import javafx.stage.StageBuilder;

public class DismissPopup extends Application {
    Text hello;
    Scene primaryScene;

    TextField f; 

    Stage extraStage;
    Scene extraScene;

    @Override
    public void start(Stage primaryStage) throws Exception {
        primaryScene = SceneBuilder
                .create()
                .width(300)
                .height(300)
                .root(new StackPane())
                .fill(Color.BLACK)
                .build();

        hello = TextBuilder
                .create()
                .text("Hello")
                .effect(new Reflection())
                .build();

        f = TextFieldBuilder
                .create()
                .promptText("Enter Some Text")
                .build();

        extraScene = SceneBuilder
                .create()
                .width(300)
                .height(300)
                .root(new StackPane())
                .fill(Color.WHEAT)
                .build();

        StackPane p = (StackPane) extraScene.getRoot();
        p.getChildren().addAll(hello);
        p = (StackPane) primaryScene.getRoot();
        p.getChildren().addAll(f);

        extraStage = StageBuilder
                    .create()
                    .scene(extraScene)
                    .build();

        extraStage.sizeToScene();

        primaryScene.setOnMouseClicked(new EventHandler<MouseEvent>(){
            @Override
            public void handle(MouseEvent me) {
                if(f.disabledProperty().get() == false){
                    f.setDisable(true);
                    f.setText("The TextField is disabled");
                    extraStage.show();
                }else{
                    f.setText("The TextField is enabled");
                    f.setDisable(false);
                    extraStage.close();
                }
            }
        });
        primaryStage.setScene(primaryScene);
        primaryStage.sizeToScene();
        primaryStage.show();
    }
    public static void main(String[] args) {
        Application.launch("stack.DismissPopup");
    }
}  

輸出:

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM