2017-02-19 5 views
-1

J'essaie d'apprendre comment ouvrir une fenêtre contextuelle JavaFX à partir d'un clic sur un élément de menu. J'ai finalement eu une nouvelle fenêtre à ouvrir mais je n'arrive pas à la rendre modale. Voici mon code:JavaFX popup ne fonctionne pas

Scène 1 FXML:

<AnchorPane id="AnchorPane" prefHeight="200" prefWidth="320" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sceneswitchtest.Scene_1Controller"> 
    <children> 
     <Button fx:id="button" layoutX="126" layoutY="90" onAction="#handleButtonAction" text="Click Me!" /> 
     <Label fx:id="label" layoutX="126" layoutY="120" minHeight="16" minWidth="69" /> 
     <MenuBar fx:id="menuBar" layoutX="40.0" layoutY="27.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"> 
     <menus> 
      <Menu mnemonicParsing="false" text="File"> 
      <items> 
       <MenuItem mnemonicParsing="false" text="Close" /> 
        <MenuItem fx:id="MenuItemOpenScene2" mnemonicParsing="false" onAction="#OpenScene2" text="Open Scene 2" /> 
      </items> 
      </Menu> 
      <Menu mnemonicParsing="false" text="Edit"> 
      <items> 
       <MenuItem mnemonicParsing="false" text="Delete" /> 
      </items> 
      </Menu> 
      <Menu mnemonicParsing="false" text="Help"> 
      <items> 
       <MenuItem mnemonicParsing="false" text="About" /> 
      </items> 
      </Menu> 
     </menus> 
     </MenuBar> 
    </children> 
</AnchorPane> 

Popup FXML:

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

<?import javafx.scene.layout.AnchorPane?> 


<AnchorPane id="AnchorPane" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sceneswitchtest.Scene_2Controller"> 

</AnchorPane> 

Scène 1 contrôleur:

package sceneswitchtest; 

import java.io.IOException; 
import javafx.event.ActionEvent; 
import javafx.fxml.FXML; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Node; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 
import javafx.scene.control.MenuBar; 
import javafx.scene.control.MenuItem; 
import javafx.stage.Modality; 
import javafx.stage.Stage; 

public class Scene_1Controller { 

    @FXML 
    private Button button; 

    @FXML 
    private Label label; 

    @FXML 
    private MenuBar menuBar; 

    @FXML 
    private MenuItem MenuItemOpenScene2; 

    @FXML 
    void OpenScene2(ActionEvent event) throws IOException { 
     Stage appStage = (Stage) ((Node) menuBar).getScene().getWindow(); 
     Parent settingsParent = FXMLLoader.load(this.getClass().getResource("Scene_2.fxml")); 
     Scene settingsScene = new Scene(settingsParent); 
     appStage.setScene(settingsScene); 

//  appStage.initModality(Modality.WINDOW_MODAL); 
//  appStage.initOwner(menuBar.getScene().getWindow()); 

     appStage.show(); 
    } 

    @FXML 
    void handleButtonAction(ActionEvent event) throws IOException { 

    } 

} 

Remarque: Dans le code ci-dessus, les lignes commentées out a échoué ainsi que l'utilisation de Modality.APPLICATION_MODAL

Scène 2 contrôleur (pop-up):

package sceneswitchtest; 


public class Scene_2Controller { 

} 

méthode principale:

paquet sceneswitchtest;

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

/** 
* 
* @author eric 
*/ 
public class SceneSwitchTest extends Application { 

    @Override 
    public void start(Stage stage) throws Exception { 
     Parent root = FXMLLoader.load(getClass().getResource("Scene_1.fxml")); 

     Scene scene = new Scene(root); 

     stage.setScene(scene); 
     stage.show(); 
    } 

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

} 
+1

Vous souhaitez afficher une fenêtre contextuelle ou simplement des scènes swich? Vous demandez comment afficher une fenêtre contextuelle, mais votre code semble juste des scènes swich dans l'étape primaire. Mettre le propriétaire de 'Stage' lui-même n'a pas de sens. Si vous avez besoin d'afficher une popup en haut de la scène primaire, créez une nouvelle méthode 'Stage' dans OpenScene2, définissez sa modalité, owner, puis' show() '. – MBec

+0

Merci MBec, j'ai changé ma méthode OpenScene2 comme vous l'avez suggéré et ça marche! – Luft

+0

BTW, je ne sais pas si vous étiez celui qui a marqué ma question vers le bas, mais celui qui a fait, puis-je souligner qu'il n'y avait rien de mal à ma question. Comme indiqué au tout début, j'essaie d'apprendre ce genre de choses. Si je savais comment le faire, je n'aurais pas à le demander, n'est-ce pas? En marquant des questions légitimes, vous validez l'opinion largement répandue que ce site est traîné par des snobs de pureté hostile. dit nuff. – Luft

Répondre

0

Voici les changements de code que j'ai faits afin de faire fonctionner le popup. Je tiens à remercier MBec de me pointer dans la bonne direction.