JavaFX新的自定义弹出窗口

 2023-02-16    458  

问题描述

我正在搜索Javafx中弹出窗口的示例.
我有javafx应用程序,在某一时刻,我需要一个弹出的窗口才能出现.这个弹出窗口需要一些复杂的输入,我需要处理和检查,然后返回主应用/窗口.

现在问题是我找不到任何地方一个示例,一个javafx控制器类调用现在如何javafx弹出窗口?我只找到审查员如何使对话框弹出窗口,但是我找不到基于javafx的新弹出窗口的示例(我看到了一个解决方案,其中有两个窗口中有两个窗口,但我只需要在需要时创建一个窗口) .

JavaFX新的自定义弹出窗口

您知道Javafx自定义弹出窗口的示例吗?

推荐答案

我想我理解您想要什么,这是一个(解决方法)示例:

  • 我已经创建了两个FXML文件,一个文件用于主窗口(mainwindow.fxml),一个用于弹出窗口(popup.fxml)
  • 为每个FXML文件创建了两个控制器类,这些控制器扩展了一个AbstractContoller类,所有有趣的事情都进入了这两个控制器.
  • 抽象控制器类只有一种方法,该方法允许混凝土控制器可以访问主应用程序
  • 在MainApp类中没有什么花哨的,只将MainWindow的控制器加载并将MainWindow设置为主要阶段场景的根源.

github上的源代码

ScreenShot

mainwindow.fxml

<?import javafx.geometry.*?>
<?import javafx.scene.text.*?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?>


<VBox alignment="CENTER" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
   <children>
      <Label text="I'm the MAiN here">
         <font>
            <Font size="24.0" />
         </font>
      </Label>
      <Label text="LETS POP THIS OUT">
         <font>
            <Font size="18.0" />
         </font>
      </Label>
      <Button fx:id="popitBtn" mnemonicParsing="false" text="NOW">
         <font>
            <Font size="14.0" />
         </font>
      </Button>
      <Label fx:id="resultLbl" text="I've got this (username: /Password: )">
         <VBox.margin>
            <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
         </VBox.margin>
      </Label>
   </children>
   <padding>
      <Insets bottom="40.0" left="40.0" right="40.0" top="40.0" />
   </padding>
</VBox>

popup.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.geometry.*?>
<?import javafx.scene.text.*?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>


<VBox alignment="CENTER" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" spacing="10.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
   <children>
      <HBox alignment="CENTER" style="-fx-background-color: #e1c1c1;">
         <children>
            <Label text="POPUP WINDOW EXAMPLE" textFill="#752b2b">
               <font>
                  <Font size="14.0" />
               </font>
            </Label>
         </children>
      </HBox>
      <HBox alignment="CENTER">
         <children>
            <Label prefWidth="70.0" text="Username" />
            <TextField fx:id="usernameTF" promptText="John Doe" />
         </children>
      </HBox>
      <HBox alignment="CENTER">
         <children>
            <Label prefWidth="70.0" text="Password" />
            <PasswordField fx:id="passwordPF" promptText="*********" />
         </children>
      </HBox>
      <HBox alignment="CENTER">
         <children>
            <Button fx:id="connectBtn" mnemonicParsing="false" text="Connect" />
         </children>
      </HBox>
   </children>
   <padding>
      <Insets bottom="20.0" left="20.0" right="20.0" top="20.0" />
   </padding>
</VBox>

AbstractController.java

public abstract class AbstractController {

    protected MainApp main;

    public void setMainApp(MainApp main) {
        this.main = main;
    }
}

mainapp.java

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class MainApp extends Application {
        private Stage primaryStage;

        public static void main(String[] args) {
            launch(args);
        }

        @Override
        public void start(Stage primaryStage) throws Exception {
            this.primaryStage = primaryStage;

            FXMLLoader loader = new FXMLLoader();
            loader.setLocation(getClass().getResource("MainWindow.fxml"));
            MainWindowController mainWindowController = new MainWindowController();
            mainWindowController.setMainApp(this);
            loader.setController(mainWindowController);
            Parent layout = loader.load();

            Scene scene = new Scene(layout);
            primaryStage.setScene(scene);
            primaryStage.show();
        }

        public Stage getPrimaryStage() {
            return primaryStage;
        }
}

mainwindowcontroller.java

import java.io.IOException;
    import java.net.URL;
    import java.util.HashMap;
    import java.util.ResourceBundle;

    import javafx.fxml.FXML;
    import javafx.fxml.FXMLLoader;
    import javafx.fxml.Initializable;
    import javafx.scene.Parent;
    import javafx.scene.Scene;
    import javafx.scene.control.Alert;
    import javafx.scene.control.Alert.AlertType;
    import javafx.scene.control.Button;
    import javafx.scene.control.Label;
    import javafx.stage.Modality;
    import javafx.stage.Stage;

    public class MainWindowController extends AbstractController implements Initializable {

        @FXML private Button popitBtn;
        @FXML private Label resultLbl;

        @Override
        public void initialize(URL url, ResourceBundle rb) {
            resultLbl.setText("Lets get something in here");
            popitBtn.setOnAction((event)->{
                HashMap<String, Object> resultMap = showPopupWindow();
                resultLbl.setText("I've got this (username: "+resultMap.get("username")
                        +" /Password: "+resultMap.get("password")+")");
            });

        }


        private HashMap<String, Object> showPopupWindow() {
            HashMap<String, Object> resultMap = new HashMap<String, Object>();

            FXMLLoader loader = new FXMLLoader();
            loader.setLocation(getClass().getResource("Popup.fxml"));
            // initializing the controller
            PopupController popupController = new PopupController();
            loader.setController(popupController);
            Parent layout;
            try {
                layout = loader.load();
                Scene scene = new Scene(layout);
                // this is the popup stage
                Stage popupStage = new Stage();
                // Giving the popup controller access to the popup stage (to allow the controller to close the stage) 
                popupController.setStage(popupStage);
                if(this.main!=null) {
                    popupStage.initOwner(main.getPrimaryStage());
                }
                popupStage.initModality(Modality.WINDOW_MODAL);
                popupStage.setScene(scene);
                popupStage.showAndWait();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return popupController.getResult();
        }
    }

popupcontroller.java

import java.net.URL;
import java.util.HashMap;
import java.util.ResourceBundle;

import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.stage.Stage;

public class PopupController extends AbstractController implements Initializable {

    @FXML private TextField usernameTF;
    @FXML private PasswordField passwordPF;
    @FXML private Button connectBtn;
    private Stage stage = null;
    private HashMap<String, Object> result = new HashMap<String, Object>();

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        connectBtn.setOnAction((event)->{
            result.clear();
            result.put("username", usernameTF.getText());
            result.put("password", passwordPF.getText());
            closeStage();
        });

    }

    public HashMap<String, Object> getResult() {
        return this.result;
    }

    /**
     * setting the stage of this view
     * @param stage
     */
    public void setStage(Stage stage) {
        this.stage = stage;
    }

    /**
     * Closes the stage of this view
     */
    private void closeStage() {
        if(stage!=null) {
            stage.close();
        }
    }

}

其他推荐答案

Khalid Sab的答案很棒.如果您使用的是castebuilder来创建fxml文件,请不要设置setController(在函数showpopupwindow()中).

只使用 –

fxmlloader loader = new fxmlloader(getClass().getResource(” fxml.file”));

因为FXML文件会自动初始化相关类.

以上所述是小编给大家介绍的JavaFX新的自定义弹出窗口,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/34027.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。