[[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());
});