![](/img/trans.png)
[英]Create a modal javafx.stage.FileChooser inside a swing application
[英]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.