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(),我也看不到任何东西。