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);
}
}
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
Merci MBec, j'ai changé ma méthode OpenScene2 comme vous l'avez suggéré et ça marche! – Luft
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