Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.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_Multithreading_Javafx_Java Threads - Fatal编程技术网

如何在静态函数中使用多个JavaFX窗口等待结果?

如何在静态函数中使用多个JavaFX窗口等待结果?,java,multithreading,javafx,java-threads,Java,Multithreading,Javafx,Java Threads,我的问题是,我如何能够轻松地等待用户输入一些信息的窗口结果 基本问题: public static char[] getPassword(String message) { run = true; showWindow(message); // JFrame or FX-Window /* DOES NOT WAIT HERE !!! */ // Working on the insert data of "password

我的问题是,我如何能够轻松地等待用户输入一些信息的窗口结果

基本问题:

public static char[] getPassword(String message) {
        run = true;
        showWindow(message);   // JFrame or FX-Window

        /* DOES NOT WAIT HERE !!! */

        // Working on the insert data of "password1"
        if (pwMatches()) {
            return password1;
        } else {
            return null;
        }
    }
-只有伪代码,未经测试!真正的代码太复杂了

任务:

  • FX窗口正在运行(主阶段)
  • 用户应在阶段(pw阶段)中输入新密码
  • 输入密码后,主阶段应继续
问题是:

  • 主阶段不等待,在输入密码之前继续
  • 简单演示代码:
结果

main 1
main 2
s1
s2
解决办法:

  • 1:https://pastebin.com/kCAep2gr
  • 2:https://pastebin.com/MSJ0kHfU
结果顺序正确

main 1
s1
s2
main 2
问题:

  • 解决方案1需要对代码进行大量修改

    • 我用过这个,但会要求更好的解决方案,还是这是最好的
  • 解决方案2不适用于JavaFX(线程不是FX线程)

问题:
JavaFX的任何简单解决方案或解决方案1是最好的吗?

此示例应用程序在输入密码之前停止主阶段的交互。密码是
password
注意:
passwordStage.initmodula(modula.APPLICATION\u modula)//如果您不希望用户与其他窗口交互,这一点很重要

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

/**
 *
 * @author blj0011
 */
public class JavaFXApplication22 extends Application {

    @Override
    public void start(Stage primaryStage) {
        Button btn = new Button();
        btn.setText("Say 'Hello World'");
        btn.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {
                Stage passwordStage = getPasswordStage();
                passwordStage.initModality(Modality.APPLICATION_MODAL);//This is important if you don't want the user to interact with other windows
                passwordStage.initOwner(primaryStage);
                passwordStage.showAndWait();
            }
        });

        BorderPane root = new BorderPane();
        root.setCenter(new StackPane(new Label("Main Center")));
        root.setTop(new StackPane(new Label("Main Screen")));
        root.setRight(new StackPane(new Label("Main Right")));
        root.setLeft(new StackPane(new Label("Main Left")));
        root.setBottom(new StackPane(btn));

        Scene scene = new Scene(root, 500, 400);

        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }

    public Stage getPasswordStage()
    {
        Stage stage = new Stage();

        TextField textField = new TextField();
        textField.setPromptText("Enter password here");

        Button button = new Button("login");
        button.setOnAction(e -> {
            if(textField.getText().equals("password"))
            {
                stage.close();
            }
        });


        VBox vbox = new VBox(new StackPane(textField), new StackPane(button));
        StackPane stackPane = new StackPane(vbox);
        Scene scene = new Scene(stackPane,300, 200);

        stage.setTitle("Login Screen");
        stage.initStyle(StageStyle.UNDECORATED);
        stage.setScene(scene);

        return stage;
    }

}
导入javafx.application.application;
导入javafx.event.ActionEvent;
导入javafx.event.EventHandler;
导入javafx.scene.scene;
导入javafx.scene.control.Button;
导入javafx.scene.control.Label;
导入javafx.scene.control.TextField;
导入javafx.scene.layout.BorderPane;
导入javafx.scene.layout.StackPane;
导入javafx.scene.layout.VBox;
导入javafx.stage.model;
导入javafx.stage.stage;
导入javafx.stage.StageStyle;
/**
*
*@author blj0011
*/
公共类JavaFXApplication22扩展了应用程序{
@凌驾
公共无效开始(阶段primaryStage){
按钮btn=新按钮();
btn.setText(“说‘你好,世界’”);
btn.setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent事件){
Stage passwordStage=getPasswordStage();
passwordStage.initmodal(MODAL.APPLICATION_MODAL);//如果不希望用户与其他窗口交互,这一点很重要
passwordStage.initOwner(primaryStage);
passwordStage.showAndWait();
}
});
BorderPane根=新的BorderPane();
root.setCenter(新堆栈窗格(新标签(“主中心”));
setTop(新的堆栈窗格(新标签(“主屏幕”));
root.setRight(新StackPane(新标签(“主右”));
setLeft(新的堆栈窗格(新标签(“主左”));
root.setBottom(新堆栈窗格(btn));
场景=新场景(根,500400);
setTitle(“你好,世界!”);
初级阶段。场景(场景);
primaryStage.show();
}
/**
*@param指定命令行参数
*/
公共静态void main(字符串[]args){
发射(args);
}
公共阶段getPasswordStage()
{
阶段=新阶段();
TextField TextField=新的TextField();
setPrompText(“在此处输入密码”);
按钮按钮=新按钮(“登录”);
按钮。设置操作(e->{
if(textField.getText().equals(“密码”))
{
stage.close();
}
});
VBox VBox=new VBox(new StackPane(textField),new StackPane(button));
StackPane StackPane=新的StackPane(vbox);
场景=新场景(stackPane,300200);
stage.setTitle(“登录屏幕”);
舞台风格(舞台风格。未装饰);
舞台场景;
返回阶段;
}
}

为什么不从您的密码开始
Stage
?您使用的是
FXML
还是纯代码?@SedrickJefferson:u第一个问题:u是更改密码,只需在代码中的某个地方调用它。是的,这将是一个解决方案,重新排序所有类和切换之间的阶段。目前它是并行的,密码帧是额外启动的第二个问题:uGUI元素是用tool.fxml创建的,控制器类是自写的.java。我发布的答案中的想法是相同的。加载
FXML
文件时,确保设置
initModality(Modality.APPLICATION\u model)您能否创建并发布一个(即,一个新的、简单但完整的项目,它只做演示问题所需的工作)?根据您的描述,最多只需几十行代码就可以做到这一点。非常感谢。在
passwordStage.showAndWait()之后插入密码可以用于您想要的任何用途。尝试将JavaFX和no FX组合起来似乎是一个糟糕的解决方案:我无法让Java切换[no FX]->[FX]->[no FX]->[no FX]->[FX]->[no FX]。FX只能启动一次,退出后似乎无法重新启动。因此,请不要使用FX,只使用FX一次,或者在FX中完全写入。多次调用一个静态方法来获得漂亮的ui似乎是不可能的(这是我的问题)。我不确定我是否知道你所说的
是什么意思,所以请不要使用Fx
?我的意思是:使用Swing、AWT或没有“无Fx”的gui。因此,创建一个程序: