Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javafx在应用程序的模态阶段使用函数替换阻塞声音_Java_Modal Dialog_Javafx 2_Javafx - Fatal编程技术网

javafx在应用程序的模态阶段使用函数替换阻塞声音

javafx在应用程序的模态阶段使用函数替换阻塞声音,java,modal-dialog,javafx-2,javafx,Java,Modal Dialog,Javafx 2,Javafx,我创建了一个小视图并将它们放在舞台上。我设置了舞台应用程序模式: stage.initModality(Modality.APPLICATION_MODAL); 如果我点击呼叫窗口,就会出现阻塞音。因此,这是正确的行动。 但是有没有可能用一个自己的功能来代替这种阻塞音呢?如果我单击调用窗口,我想关闭新阶段,但我确实尝试了我想到的所有方法,即使是Event的Eventfilter。ANY不起作用: stage.addEventFilter(Event.ANY, new EventHand

我创建了一个小视图并将它们放在舞台上。我设置了舞台应用程序模式:

stage.initModality(Modality.APPLICATION_MODAL);
如果我点击呼叫窗口,就会出现阻塞音。因此,这是正确的行动。 但是有没有可能用一个自己的功能来代替这种阻塞音呢?如果我单击调用窗口,我想关闭新阶段,但我确实尝试了我想到的所有方法,即使是Event的Eventfilter。ANY不起作用:

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

        @Override
        public void handle(Event event) {
            System.out.println("Event catched: "+event);
        }
    });
stage.addEventFilter(Event.ANY,new EventHandler()){
@凌驾
公共无效句柄(事件){
System.out.println(“捕捉到的事件:+事件”);
}
});

有什么方法可以处理调用窗口上的点击吗?

当您将某个设置为
应用程序_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");
    }
}  
包栈;
导入javafx.application.application;
导入javafx.event.EventHandler;
导入javafx.scene.scene;
导入javafx.scene.SceneBuilder;
导入javafx.scene.control.TextField;
导入javafx.scene.control.TextFieldBuilder;
导入javafx.scene.effect.Reflection;
导入javafx.scene.input.MouseEvent;
导入javafx.scene.layout.Pane;
导入javafx.scene.layout.StackPane;
导入javafx.scene.paint.Color;
导入javafx.scene.text.text;
导入javafx.scene.text.TextBuilder;
导入javafx.stage.model;
导入javafx.stage.Popup;
导入javafx.stage.stage;
导入javafx.stage.StageBuilder;
公共类可扩展应用程序{
短信你好;
场景主要场景;
文本字段f;
阶段外阶段;
场景外部场景;
@凌驾
public void start(Stage primaryStage)引发异常{
primarysecene=SceneBuilder
.create()
.宽度(300)
.高度(300)
.root(新的StackPane())
.填充(颜色.黑色)
.build();
hello=TextBuilder
.create()
.text(“你好”)
.effect(新反射())
.build();
f=文本字段生成器
.create()
.promptext(“输入一些文本”)
.build();
extraScene=SceneBuilder
.create()
.宽度(300)
.高度(300)
.root(新的StackPane())
.填充(颜色.小麦)
.build();
StackPane p=(StackPane)外部场景.getRoot();
p、 getChildren().addAll(hello);
p=(StackPane)primarysecene.getRoot();
p、 getChildren().addAll(f);
extraStage=StageBuilder
.create()
.现场(现场外)
.build();
extraStage.sizeToScene();
setOnMouseClicked(新的EventHandler(){
@凌驾
公共无效句柄(MouseEvent me){
if(f.disabledProperty().get()==false){
f、 设置禁用(true);
f、 setText(“文本字段已禁用”);
extraStage.show();
}否则{
f、 setText(“文本字段已启用”);
f、 设置禁用(假);
extraStage.close();
}
}
});
初始阶段。设置场景(初始场景);
primaryStage.sizeToScene();
primaryStage.show();
}
公共静态void main(字符串[]args){
Application.launch(“stack.dismisspoop”);
}
}  
输出:


你好,孩子。此解决方案的效果与我已有的版本相同。如果我的父阶段处于全屏状态,并且我显示了新阶段,则呼叫阶段将被发送到后台,桌面上的其他窗口将覆盖呼叫阶段,并显示windows任务栏。这就是为什么我要求用一个自己的函数替换应用程序的模态阶段的windows声音。问题是,这个函数在哪里注册?在召唤台上?在所谓的舞台上?我不知道,但是,非常感谢你的帮助@MutenRoshi你看过
Popup
class吗?是的,但我找不到任何有用的方法。如果我创建了一个弹出窗口,将我的舞台加入并调用show(),我也看不到任何东西。