[[oktatas:programozás:java:java_fx|< Java FX]] ====== JavaFX - Párbeszédablak ====== * **Szerző:** Sallai András * Copyright (c) 2023, Sallai András * Szerkesztve: 2023, 2025 * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC Attribution-Share Alike 4.0 International]] * Web: https://szit.hu ===== Gyermekablak létrehozása ===== A következő egy hozzáadásablak alapját szolgáltatja. package views.add; import javafx.scene.Scene; import javafx.stage.Modality; import javafx.stage.Stage; public class AddStage extends Stage { public AddStage() { this.setTitle("Hozzáadás"); this.initModality(Modality.APPLICATION_MODAL); AddPanel addPanel = new AddPanel(); Scene scene = new Scene(addPanel, 300, 200); this.setScene(scene); } } Az AddPanel-en találhatók a további kontrollok. ==== Modális ablak beállítása ==== this.initModality(Modality.APPLICATION_MODAL); ==== Ablak bezárása ==== Stage stage = (Stage) addPanel.getScene().getWindow(); stage.close(); ==== A showAndWait() ==== A show() utáni utasítások az ablak megjelenítésétől függetlenül lefutnak. System.out.println("Hozzáadás..."); addView.show(); System.out.println("Az adatok újrakérése"); mainView.getTablePanel().getProducts(); Ha a showAndWait() metódust használjuk, az ezt követő metódusok megvárják az ablak bezárását. System.out.println("Hozzáadás..."); addView.showAndWait(); System.out.println("Az adatok újrakérése"); mainView.getTablePanel().getProducts(); ===== A Dialog osztály ===== import javafx.scene.control.ButtonType; import javafx.scene.control.Dialog; import javafx.scene.control.ButtonBar.ButtonData; public class TestDialog extends Dialog { public TestDialog() { this.setTitle("Teszt"); ButtonType type = new ButtonType("Ok", ButtonData.OK_DONE); this.getDialogPane().getButtonTypes().add(type); this.setContentText("Teszt"); } } A a visszatérési érték típusa. Megjelenítés: new TestDialog().show(); Dokumentáció: * https://openjfx.io/javadoc/17/javafx.controls/javafx/scene/control/Dialog.html (2023) * https://openjfx.io/javadoc/19/javafx.controls/javafx/scene/control/Dialog.html (2023) ==== Kontrollok tartalomként ==== import javafx.scene.control.ButtonType; import javafx.scene.control.Dialog; import javafx.scene.control.ButtonBar.ButtonData; public class TestDialog extends Dialog { public TestDialog() { this.setTitle("Teszt"); ButtonType type = new ButtonType("Mentés", ButtonData.OK_DONE); this.getDialogPane().getButtonTypes().add(type); this.getDialogPane().setContent(new AddView()); } } import javafx.scene.layout.VBox; import views.InputPanel; public class AddView extends VBox { InputPanel nameInput; InputPanel actnumberInput; public AddView() { this.initComponent(); this.addComponent(); } private void initComponent() { this.nameInput = new InputPanel("Név"); this.actnumberInput = new InputPanel("Cikkszám"); } private void addComponent() { this.getChildren().add(this.nameInput); this.getChildren().add(this.actnumberInput); } } package views; import javafx.scene.control.Label; import javafx.scene.control.TextField; import javafx.scene.layout.HBox; public class InputPanel extends HBox { Label label; TextField field; public InputPanel() { this.initComponent(); this.addComponent(); } public InputPanel(String text) { this.initComponent(); this.addComponent(); this.label.setText(text); } private void initComponent() { this.label = new Label(); this.field = new TextField(); this.label.setMinWidth(100); } private void addComponent() { this.getChildren().add(this.label); this.getChildren().add(this.field); } } Futtatás: new TestDialog().show(); ==== Kép ==== dialog.setGraphic(new ImageView(this.getClass().getResource("kepnev.png").toString())); ===== Alert ===== Törlést megerősítő metódus: private boolean confirmDelete() { Alert alert = new Alert(AlertType.CONFIRMATION ); alert.setTitle("Törlés"); alert.setHeaderText("Törlés"); alert.setContentText("Biztosan törlöd?"); alert.showAndWait(); if (alert.getResult() == ButtonType.OK) return true; else return false; } ==== Középre igazítás ==== A lényeg: alert.initOwner(App._stage); Tegyük fel, hogy VSCode bővímtménnyel hoztuk létre a projektet, ahol van egy App.java fájl, meg egy MainController.java fájl. //... public static Stage _stage; @Override public void start(Stage stage) throws IOException { _stage = stage; scene = new Scene(loadFXML("primary"), 640, 480); stage.setScene(scene); stage.show(); } //... //... Alert alert = new Alert(AlertType.INFORMATION); alert.setTitle("Információ"); alert.setHeaderText("Nézze meg az információt"); alert.setContentText("Üzenet"); alert.initOwner(App._stage); alert.showAndWait(); //... ==== Megerősítés ==== import javafx.scene.control.ButtonType; //... Alert alert = new Alert(Alert.AlertType.CONFIRMATION); Optional result = alert.showAndWait(); if (result.get() == ButtonType.OK) { System.out.println("OK"); } if(result.get() == ButtonType.CANCEL) { System.out.println("CANCEL"); } {{:oktatas:programozas:java:java_fx:javafx_alert_megerosites.png|}} ==== Saját gombok ==== import java.util.Optional; import javafx.scene.control.Alert; import javafx.scene.control.ButtonType; //... Alert alert = new Alert(Alert.AlertType.CONFIRMATION); ButtonType yesButton = new ButtonType("Igen"); ButtonType noButton = new ButtonType("Nem"); alert.getButtonTypes().setAll(yesButton, noButton); Optional result = alert.showAndWait(); if (result.get() == yesButton) { System.out.println("igen"); } if(result.get() == noButton) { System.out.println("nem"); } {{:oktatas:programozas:java:java_fx:javafx_alert_sajatgombok.png|}} ==== Ikon helyett saját kép ==== Egy 50x50-s képet megjelenítése. Alert alert = new Alert(Alert.AlertType.INFORMATION); Image image = new Image(getClass() .getResourceAsStream("kep.png")); ImageView imageView = new ImageView(image); imageView.setFitWidth(50); imageView.setFitHeight(50); alert.setTitle("Üdvözlő kép"); alert.setHeaderText("Helló"); alert.getDialogPane().setGraphic(imageView); alert.show(); {{:oktatas:programozas:java:java_fx:javafx_alert_sajatkep.png|}} ===== ChoiceDialog ===== import java.util.Optional; import javafx.scene.control.ChoiceDialog; //... ChoiceDialog dialog = new ChoiceDialog<>("Java", "Java", "C++", "C#"); dialog.setTitle("Válassz nyelvet"); dialog.setHeaderText("Válassz nyelvet"); Optional result = dialog.showAndWait(); result.ifPresent(System.out::println); //vagy: String selected = result.orElse(null); System.out.println(selected); A ChoiceDialog<>() konstruktorában az első paraméter az alapértelmezett érték, esetünkben ez a Java: new ChoiceDialog<>("Java", "Java", "C++", "C#"); Az orElse() alapértelmezetten sztring adható meg: String selected = result.orElse("Nincs kiválasztva"); System.out.println(selected); {{:oktatas:programozas:java:java_fx:javafx_choicedialog.png|}} ===== Fájlválasztás ===== * javafx.stage.FileChooser FileChooser chooser = new FileChooser(); chooser.setTitle("Fájl kiválasztása"); chooser.showOpenDialog(App._stage); FileChooser fileChooser = new FileChooser(); fileChooser.setTitle("Open Resource File"); fileChooser.getExtensionFilters().addAll( new ExtensionFilter("Szöveges fájlok", "*.txt", "*.csv", "*.gif"), new ExtensionFilter("JSON fájlok", "*.json"), new ExtensionFilter("Minden fájl", "*.*")); File selectedFile = fileChooser.showOpenDialog(mainStage); if (selectedFile != null) { mainStage.display(selectedFile); } Kezdőkönyvtár beállítása: fileChooser.setInitialDirectory(new File("e:\\")); ===== Könyvtárválasztás ===== * javafx.stage.DirectoryChooser DirectoryChooser chooser = new DirectoryChooser(); chooser.setTitle("Könyvtár választása"); chooser.showDialog(App._stage); DirectoryChooser directoryChooser = new DirectoryChooser(); directoryChooser.setInitialDirectory(new File("valami")); Button button = new Button("Könyvtárválasztása"); button.setOnAction(e -> { File selectedDirectory = directoryChooser.showDialog(primaryStage); System.out.println(selectedDirectory.getAbsolutePath()); });