2016-05-24 3 views
1

Я ищу пример выпадающих окон в JavaFX. У меня есть приложение JavaFX, и в какой-то момент мне нужно всплывающее окно. это всплывающие окна требуют некоторых сложных входов, которые мне нужно обработать и проверить и вернуться к главному приложению/окну.JavaFX новое настраиваемое всплывающее окно

Теперь проблема заключается в том, что я не могу найти нигде пример того, как в одном классе контроллера JavaFX вызывается окно всплывающего окна JavaFX? Я только нахожу пример, как сделать диалоговое окно с выворачиванием окон, но я не могу найти пример нового всплывающего окна на основе JavaFX (я увидел одно решение, в котором есть два окна в паралоге, но мне нужно будет создать его только тогда, когда это необходимо) ,

Знаете ли вы о таком примере пользовательского всплывающего окна JavaFx?

+0

Я предполагаю, что вы имели в виду поп *** до *** ... – fabian

+0

Вы можете сохранить всплывающее содержание в отдельной стадии и открыт а также нажмите кнопку «ОК», чтобы закрыть этот «этап». –

+0

Это может помочь http://stackoverflow.com/questions/22166610/how-to-create-a- popup-windows-in-javafx и http://stackoverflow.com/questions/12717969/javafx-2-custom-popup-pane –

ответ

4

Я думаю, я понимаю, что вы хотите, здесь есть (обходной путь) Пример:

  • Я создал два FXML файлов, один для главного окна (MainWindow.fxml) и один для всплывающего окна (Popup.fxml)
  • Создал два класса контроллеров для каждого файла fxml, эти контроллеры расширяют класс AbstractContoller, все интересное идет в эти два контроллера.
  • Реферативный класс контроллера имеет только один метод, который позволяет конкретным контроллерам иметь доступ к основному приложению.
  • Ничего особенного в классе mainApp, просто загружая контроллер MainWindow и устанавливая MainWindow как корень сцены основной сцены ,

source code on 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(); 
     } 
    } 

} 
+0

ДА Это именно то, что я искал. Большое спасибо! – Demosten

+0

You ar e welcome :), пожалуйста, не забудьте отметить этот ответ как правильный, если вы так думаете;) –

+0

Этот пример отлично работает, и файлы github работают отлично. – Hemantha

0

ответ Халид SAB «S велик. Если вы используете scriptBuilder для создания файла fxml, не устанавливайте setController (в функции showPopupWindow()).

просто использовать -

FXMLLoader погрузчик = новый FXMLLoader (GetClass() getResource ("FXML..Файл "));.

Поскольку FXML файл автоматически инициализировать соответствующий класс

Смежные вопросы