[[oktatas:programozás:java:java_fx|< Java FX]] ====== Java FX tananyag ====== * **Szerző:** Sallai András * Copyright (c) Sallai András, 2021, 2022, 2023 * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC Attribution-Share Alike 4.0 International]] * Web: https://szit.hu ===== Helló Világ ===== Első programunk egy ablakot jelenít meg egy felirattal. Ehhez négy osztályra van szükségünk. import javafx.application.Application; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.layout.StackPane; public class App extends Application { @Override public void start(Stage stage) { StackPane root = new StackPane(); Scene scene = new Scene(root, 300, 250); stage.setScene(scene); stage.setTitle("Helló Világ!"); stage.show(); } } A stage egy ablaknak felel meg. A scene azon belül egy konténernek. Futtatás a bin könyvtárból: java --module-path /home/janos/Library/javafx-sdk-16/lib --add-modules javafx.controls,javafx.fxml App ===== A main() metódus ===== A JavaFX program elfut a main() metódus nélkül is; azért szokták hozzáadni, mert így kezelhetők a parancssori argumentumok is. import javafx.application.Application; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.layout.StackPane; public class App extends Application { @Override public void start(Stage stage) { StackPane root = new StackPane(); Scene scene = new Scene(root, 300, 250); stage.setScene(scene); stage.setTitle("Helló Világ!"); stage.show(); } public static void main(String[] args) { launch(args); } } {{:oktatas:programozas:java:java_fx:javafx_hellovilag_mainmethod.png|}} Egyes kódszerkesztők (ilyen a Visual Studio Code is) esetén előfordulhat, hogy nem hajlandó futni csak main() metódus megléte esetén. ===== Text ===== A Text osztály szöveg megjelenítésére alkalmas. import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.layout.VBox; import javafx.scene.text.Text; import javafx.stage.Stage; public class App extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage stage) throws Exception { Text text = new Text("Helló"); Scene scene = new Scene(new VBox(text), 300, 250); stage.setScene(scene); stage.setTitle("Valami"); stage.show(); } } {{:oktatas:programozas:java:java_fx:javafx_text_control.png|}} ==== Szöveg elhelyezése ==== import javafx.application.Application; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.text.Text; import javafx.stage.Stage; public class App extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage stage) throws Exception { Text text = new Text(); text.setText("Helló Világ"); text.setX(150); text.setY(150); Group root = new Group(text); Scene scene = new Scene(root, 300, 250); stage.setScene(scene); stage.setTitle("Valami"); stage.show(); } } {{:oktatas:programozas:java:java_fx:javafx_text_control_position.png|}} ===== Label ===== A Label osztály szöveg és mellette egy kép megjelenítésére alkalmas. import javafx.application.Application; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.control.Label; public class App extends Application { @Override public void start(Stage stage) { Label label = new Label("Helló"); Scene scene = new Scene(label, 300, 250); stage.setScene(scene); stage.setTitle("Valami"); stage.show(); } public static void main(String[] args) { launch(args); } } Fontbeállítás: import javafx.scene.text.Font; ... label.setFont(new Font("Arial", 24)); {{:oktatas:programozas:java:java_fx:javafx_label_control_setfont.png|}} Szövegbeállítás: label.setText("Új szöveg"); Kép beállítása szöveg mellé: ... import javafx.scene.image.Image; import javafx.scene.image.ImageView; ... String iconPath = "resources/images/icon01.png"; FileInputStream input = new FileInputStream(iconPath); Image image = new Image(input); ImageView imageView = new ImageView(image); Label label = new Label("Helló", imageView); A fájlbeolvasást tegyük a ''label'' objektum létrehozása elé. {{:oktatas:programozas:java:java_fx:javafx_label_control_plus_image.png|}} app01/ |-.vscode/ | |-launch.json | `-settings.json |-bin/ |-lib/ |-resouces/ | `-images/ | `-kep01.png |-src/ | `-App.java `-README.md Szöveg igazítása: label1.setAligment(Pos.CENTER); Ügyeljünk a label1 szélességére. Tegyük egy konténerben, amiben a mérete teljes szélességű. Abszolút pozíciónálás: public void start(Stage stage) throws Exception { Pane pane = new Pane(); Label label1 = new Label("Első"); Label label2 = new Label("Második"); label1.setLayoutX(50); label1.setLayoutY(50); label2.setLayoutX(50); label2.setLayoutY(70); pane.getChildren().addAll(label1, label2); Scene scene = new Scene(pane, 400, 300); stage.setScene(scene); stage.show(); } ===== Nyomógomb ===== Importáljuk a gombot: import javafx.scene.control.Button; Példányosítjuk a start() metódusban, majd adjuk a panelhez: Button button = new Button("Katt"); //... root.getChildren().add(button); A teljes kód: import javafx.application.Application; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.layout.StackPane; public class App extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage stage) { Button button = new Button("Mehet"); StackPane root = new StackPane(); root.getChildren().add(button); Scene scene = new Scene(root, 300, 250); stage.setScene(scene); stage.setTitle("Valami"); stage.show(); } } {{:oktatas:programozas:java:java_fx:javafx_button_control.png|}} ===== Nyomógomb eseménye ===== Szükségünk van két új osztályra: import javafx.event.ActionEvent; import javafx.event.EventHandler; Adjunk a gombhoz eseménykezelést: button.setOnAction(new EventHandler() { @Override public void handle(ActionEvent event) { System.out.println("Kattintás volt"); } }); A teljes kód: import javafx.application.Application; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.layout.StackPane; import javafx.scene.control.Button; import javafx.event.ActionEvent; import javafx.event.EventHandler; public class App extends Application { @Override public void start(Stage stage) { Button button = new Button("Katt"); button.setOnAction(new EventHandler() { @Override public void handle(ActionEvent event) { System.out.println("Kattintás volt"); } }); StackPane root = new StackPane(); root.getChildren().add(button); Scene scene = new Scene(root, 300, 250); stage.setScene(scene); stage.setTitle("Valami"); stage.show(); } public static void main(String[] args) { launch(args); } } Kilépés programból: stage.close(); Eseménykezelés lambda kifejezéssel a [[oktatas:programozas:java:java_fx:tananyag#gomb_lambda_esemenykezelessel|függelékben]]. ===== ToggleButton ===== import javafx.scene.control.ToggleButton; ... ToggleButton toggleButton1 = new ToggleButton("Mehet"); ... A lenyomott állapot ellenőrzése: boolean lenyomva = toggleButton1.isSelected(); Teljes kód: import javafx.application.Application; import javafx.geometry.Insets; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.control.ToggleButton; import javafx.scene.layout.VBox; public class App extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) { ToggleButton toggleButton1 = new ToggleButton("Fent"); ToggleButton toggleButton2 = new ToggleButton("Lenyomva"); VBox vbox = new VBox(); vbox.setPadding(new Insets(10, 10, 10, 10)); vbox.setSpacing(10); vbox.getChildren().add(toggleButton1); vbox.getChildren().add(toggleButton2); Scene scene = new Scene(vbox, 300, 250); primaryStage.setScene(scene); primaryStage.setTitle("Valami"); primaryStage.show(); } } {{:oktatas:programozas:java:java_fx:two_togglebutton.png|}} ===== Elrendezés ===== Függőleges elrendezéshez használjuk a VBox osztályt: VBox vbox = new VBox(); vbox.getChildren().addAll(label, button); Vízszintes elrendezéshez HBox osztály használahtó. import javafx.application.Application; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.layout.VBox; import javafx.scene.control.Button; import javafx.scene.control.Label; public class App extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) { Label label = new Label("Felirat"); Button button = new Button("Gomb"); VBox vbox = new VBox(); vbox.getChildren().addAll(label, button); Scene scene = new Scene(vbox, 300, 250); primaryStage.setScene(scene); primaryStage.show(); } } {{:oktatas:programozas:java:java_fx:javafx_layout_vbox01.png|}} 20 pixel a komponensek között: VBox vbox = new VBox(20); ==== Két gomb függőlegesen ==== import javafx.application.Application; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.layout.StackPane; import javafx.scene.layout.VBox; public class App extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage stage) { Button button1 = new Button("Mehet"); Button button2 = new Button("Mehet"); button1.setOnAction(e -> onButton1Click()); button2.setOnAction(e -> onButton2Click()); StackPane root = new StackPane(); VBox vbox = new VBox(10); vbox.getChildren().addAll(button1, button2); root.getChildren().add(vbox); Scene scene = new Scene(root, 300, 250); stage.setScene(scene); stage.setTitle("Valami"); stage.show(); } private void onButton1Click() { System.out.println("1-s gomb kattintás"); } private void onButton2Click() { System.out.println("2-s gomb kattintás"); } } {{:oktatas:programozas:java:java_fx:javafx_layout_vbox.png|}} ===== Scene csere ===== import javafx.application.Application; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.layout.VBox; import javafx.scene.control.Button; import javafx.scene.control.Label; public class App extends Application { Stage primaryStage; public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) { this.primaryStage = primaryStage; Label label1 = new Label("Első"); Button button1 = new Button("Másik"); VBox vbox1 = new VBox(); vbox1.getChildren().addAll(label1, button1); Scene scene1 = new Scene(vbox1, 300, 250); Label label2 = new Label("Második"); Button button2 = new Button("Vissza"); VBox vbox2 = new VBox(); vbox2.getChildren().addAll(label2, button2); Scene scene2 = new Scene(vbox2, 300, 250); button1.setOnAction(e -> primaryStage.setScene(scene2)); button2.setOnAction(e -> primaryStage.setScene(scene1)); primaryStage.setScene(scene1); primaryStage.show(); } } ===== Párbeszédablak ===== import javafx.application.Application; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.layout.VBox; import javafx.scene.control.Button; import javafx.scene.control.Label; public class App extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) { Label label1 = new Label("Első"); Button button1 = new Button("Másik"); VBox vbox1 = new VBox(); vbox1.getChildren().addAll(label1, button1); Scene scene1 = new Scene(vbox1, 300, 250); button1.setOnAction(e -> MsgBox.show("cím", "Valami")); primaryStage.setScene(scene1); primaryStage.show(); } } import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.layout.VBox; import javafx.stage.Modality; import javafx.stage.Stage; public class MsgBox { public static void show(String title, String msg) { Stage stage = new Stage(); stage.initModality(Modality.APPLICATION_MODAL); stage.setTitle(title); Label label = new Label(msg); Button button = new Button("Bezár"); button.setOnAction(e -> stage.close()); VBox vbox = new VBox(); vbox.getChildren().addAll(label, button); vbox.setAlignment(Pos.CENTER); Scene scene = new Scene(vbox, 300, 250); stage.setScene(scene); stage.show(); } } {{:oktatas:programozas:java:java_fx:javafx_messagebox.png|}} ===== Dialógus ablak ===== Szükségünk van a showAndWait(); metódusra, mert máskülönben a System.out.println() nem várja meg az ablak bezárását. import javafx.application.Application; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.layout.StackPane; public class App extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) throws Exception { Button goButton = new Button("Mehet"); goButton.setOnAction(e -> { boolean result = DlgBox.show("cím", "Biztos?"); System.out.println("válasz: " + result); }); StackPane root = new StackPane(); root.getChildren().add(goButton); Scene scene1 = new Scene(root, 300, 250); primaryStage.setScene(scene1); primaryStage.show(); } } import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import javafx.stage.Modality; import javafx.stage.Stage; public class DlgBox { static boolean result; public static boolean show(String title, String msg) { Stage stage = new Stage(); stage.initModality(Modality.APPLICATION_MODAL); stage.setTitle(title); Label label = new Label(msg); Button yesButton = new Button("Igen"); Button noButton = new Button("Nem"); yesButton.setOnAction(e -> { result = true; stage.close(); }); noButton.setOnAction(e -> { result = false; stage.close(); }); VBox vbox = new VBox(); HBox hbox = new HBox(10); vbox.getChildren().addAll(label, hbox); vbox.setAlignment(Pos.CENTER); hbox.getChildren().addAll(yesButton, noButton); hbox.setAlignment(Pos.CENTER); Scene scene = new Scene(vbox, 300, 250); stage.setScene(scene); stage.showAndWait(); return result; } } {{:oktatas:programozas:java:java_fx:javafx_dialogbox.png|}} ===== Üzenetdoboz ===== import javafx.scene.control.Alert; ... Alert alert = new Alert(Alert.AlertType.INFORMATION); alert.setTitle("Címsor szöveg"); alert.setHeaderText("Fejrész szöveg"); alert.setContentText("Üzenet"); alert.showAndWait(); Teljes kód: import javafx.application.Application; import javafx.geometry.Insets; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.Alert; import javafx.scene.layout.VBox; public class App extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) throws Exception { Button showButton = new Button("Mutat"); Alert alert = new Alert(Alert.AlertType.INFORMATION); showButton.setOnAction(e -> { alert.setTitle("Címsor szöveg"); alert.setHeaderText("Fejrész szöveg"); alert.setContentText("Üzenet"); alert.showAndWait(); }); VBox vbox = new VBox(); vbox.setPadding(new Insets(10, 10, 10, 10)); vbox.setSpacing(10); vbox.getChildren().add(showButton); Scene scene = new Scene(vbox, 300, 250); primaryStage.setScene(scene); primaryStage.show(); } } {{:oktatas:programozas:java:java_fx:alert_message.png|}} ===== Beviteli ===== Bevitelhez a TextField osztály használjuk. import javafx.application.Application; import javafx.geometry.Insets; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.TextField; import javafx.scene.layout.VBox; public class App extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) throws Exception { TextField numInput = new TextField(); Button doubleButton = new Button("Dupla"); doubleButton.setOnAction(e -> { String numStr = numInput.getText(); int num = Integer.parseInt(numStr); Integer result = num * 2; numInput.setText(result.toString()); }); VBox vbox = new VBox(); vbox.setPadding(new Insets(10, 10, 10, 10)); vbox.getChildren().addAll(numInput, doubleButton); Scene scene = new Scene(vbox, 300, 250); primaryStage.setScene(scene); primaryStage.show(); } } {{:oktatas:programozas:java:java_fx:javafx_textfield_control.png|}} ===== Jelszó ===== Jelszóbevitel ... import javafx.scene.control.PasswordField; ... PasswordField passInput = new PasswordField(); passInput.setPromptText("password"); A következő program egy felhasználónevet és jelszót kér be. Teljes kód: import javafx.application.Application; import javafx.geometry.Insets; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.TextField; import javafx.scene.control.PasswordField; import javafx.scene.control.Alert; import javafx.scene.layout.VBox; public class App extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) throws Exception { TextField userInput = new TextField(); PasswordField passInput = new PasswordField(); passInput.setPromptText("jelszó"); Button loginButton = new Button("Belépés"); Alert alert = new Alert(Alert.AlertType.INFORMATION); loginButton.setOnAction(e -> { String user = userInput.getText(); String pass = passInput.getText(); System.out.printf("|%s|\n",user); System.out.printf("|%s|\n", pass); String msgStr = ""; if(user.equals("janos") && pass.equals("titok")) { msgStr = "Azonosítás OK"; }else { msgStr = "Hiba! Azonosítás sikertelen!"; } alert.setContentText(msgStr); alert.showAndWait(); }); VBox vbox = new VBox(); vbox.setPadding(new Insets(10, 10, 10, 10)); vbox.setSpacing(10); vbox.getChildren().add(userInput); vbox.getChildren().add(passInput); vbox.getChildren().add(loginButton); Scene scene = new Scene(vbox, 300, 250); primaryStage.setScene(scene); primaryStage.show(); } } {{:oktatas:programozas:java:java_fx:user_pass_input.png|}} * https://docs.oracle.com/javafx/2/ui_controls/password-field.htm ===== Rádiógomb ===== import javafx.scene.control.RadioButton; ... RadioButton rb1 = new RadioButton(); rb1.setText("Valami"); Esetleg így: RadioButton rb1 = new RadioButton("Valami"); Csoportosítás: final ToggleGroup group1 = new ToggleGroup(); RadioButton radio1 = new RadioButton("Emese"); RadioButton radio2 = new RadioButton("Béla"); radio1.setToggleGroup(group1); radio2.setToggleGroup(group1); A kiválasztott gomb vizsgálata: System.out.println(radio1.isSelected() ); Teljes kód: import javafx.application.Application; import javafx.geometry.Insets; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.RadioButton; import javafx.scene.control.ToggleGroup; import javafx.scene.layout.VBox; public class App extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) throws Exception { final ToggleGroup group1 = new ToggleGroup(); RadioButton radio1 = new RadioButton("Emese"); RadioButton radio2 = new RadioButton("Béla"); Button button1 = new Button("Választ"); radio1.setToggleGroup(group1); radio2.setToggleGroup(group1); button1.setOnAction(e -> { String valasztott = ""; if(radio1.isSelected()) { valasztott = "Emese"; }else { valasztott = "Béla"; } System.out.println("Választott: " + valasztott); }); VBox vbox = new VBox(10); vbox.setPadding(new Insets(10, 10, 10, 10)); vbox.getChildren().addAll(radio1, radio2, button1); Scene scene = new Scene(vbox, 300, 250); primaryStage.setScene(scene); primaryStage.show(); } } {{:oktatas:programozas:java:java_fx:radiobutton_example.png|}} Link: * https://docs.oracle.com/javafx/2/ui_controls/radio-button.htm (2022) ===== Jelőlönézet ===== import javafx.application.Application; import javafx.geometry.Insets; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.CheckBox; import javafx.scene.layout.VBox; public class App extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) throws Exception { CheckBox checkbox1 = new CheckBox("Emese"); CheckBox checkbox2 = new CheckBox("Béla"); Button button = new Button("Dupla"); checkbox1.setSelected(true); button.setOnAction(e -> { if (checkbox1.isSelected()) { System.out.println("Emese ok"); } if (checkbox2.isSelected()) { System.out.println("Béla ok"); } }); VBox vbox = new VBox(10); vbox.setPadding(new Insets(10, 10, 10, 10)); vbox.getChildren().addAll(checkbox1, checkbox2, button); Scene scene = new Scene(vbox, 300, 250); primaryStage.setScene(scene); primaryStage.show(); } } {{:oktatas:programozas:java:java_fx:javafx_checkbox_control.png|}} ===== ChoiceBox ===== import javafx.application.Application; import javafx.geometry.Insets; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.ChoiceBox; import javafx.scene.layout.VBox; public class App extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) throws Exception { ChoiceBox choicebox = new ChoiceBox<>(); choicebox.setValue("Szilva"); choicebox.getItems().add("szilva"); choicebox.getItems().add("körte"); choicebox.getItems().add("barack"); choicebox.getItems().addAll("alma", "banán", "citrom"); Button button = new Button("Mehet"); button.setOnAction(e -> { System.out.println(choicebox.getValue()); }); VBox vbox = new VBox(10); vbox.setPadding(new Insets(10, 10, 10, 10)); vbox.getChildren().addAll(choicebox, button); Scene scene = new Scene(vbox, 300, 250); primaryStage.setScene(scene); primaryStage.show(); } } {{:oktatas:programozas:java:java_fx:javafx_choicebox_control.png|}} A szelekció változásának figyelése: choicebox.getSelectionModel().selectedItemProperty() .addListener((obj, oldValue, newValue) -> System.out.println(newValue)); ===== ComboBox ===== import javafx.application.Application; import javafx.geometry.Insets; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.ComboBox; import javafx.scene.layout.VBox; public class App extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) throws Exception { ComboBox combobox = new ComboBox<>(); combobox.getItems().add("alma"); combobox.getItems().add("körte"); combobox.getItems().add("barack"); combobox.getItems().addAll("szilva", "banán", "citrom"); combobox.setValue("barack"); Button button = new Button("Mehet"); button.setOnAction(e -> { System.out.println(combobox.getValue()); }); VBox vbox = new VBox(10); vbox.setPadding(new Insets(10, 10, 10, 10)); vbox.getChildren().addAll(combobox, button); Scene scene = new Scene(vbox, 300, 250); primaryStage.setScene(scene); primaryStage.show(); } } {{:oktatas:programozas:java:java_fx:javafx_combobox_control.png|}} Beállíthatunk olyan szöveget is, ami előzetesen megjelenik, de nem jelent kiválasztást: //combobox.setValue("barack"); combobox.setPromptText("Válassz gyümölcsöt"); Ebben az esetben törölni kell a setValue() beállítást. Változás figyelése: combobox.setOnAction(e -> System.out.println("Valami ki lett választva")); Szerkeszthetőség beállítása: combobox.setEditable(true); ===== ListBox ===== import javafx.application.Application; import javafx.geometry.Insets; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.ListView; import javafx.scene.layout.VBox; public class App extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) throws Exception { ListView list = new ListView<>(); list.getItems().setAll("alma", "körte", "barack", "szilva"); Button button = new Button("Mehet"); button.setOnAction(e -> { System.out.println(list.getSelectionModel().getSelectedIndex()); System.out.println(list.getSelectionModel().getSelectedItem()); }); VBox vbox = new VBox(10); vbox.setPadding(new Insets(10, 10, 10, 10)); vbox.getChildren().addAll(list, button); Scene scene = new Scene(vbox, 300, 250); primaryStage.setScene(scene); primaryStage.show(); } } {{:oktatas:programozas:java:java_fx:javafx_listview_control_oneline.png|}} Többsoros kijelölés: import javafx.application.Application; import javafx.collections.ObservableList; import javafx.geometry.Insets; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.ListView; import javafx.scene.control.SelectionMode; import javafx.scene.layout.VBox; public class App extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) throws Exception { ListView list = new ListView<>(); list.getItems().setAll("alma", "körte", "barack", "szilva"); list.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); Button button = new Button("Mehet"); button.setOnAction(e -> { ObservableList obsList; obsList = list.getSelectionModel().getSelectedItems(); for (String item : obsList) { System.out.println(item); } }); VBox vbox = new VBox(10); vbox.setPadding(new Insets(10, 10, 10, 10)); vbox.getChildren().addAll(list, button); Scene scene = new Scene(vbox, 300, 250); primaryStage.setScene(scene); primaryStage.show(); } } {{:oktatas:programozas:java:java_fx:javafx_listview_control_multiline.png|}} ===== TreeView ===== import javafx.application.Application; import javafx.geometry.Insets; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.TreeItem; import javafx.scene.control.TreeView; import javafx.scene.layout.VBox; public class App extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) throws Exception { TreeView tree; TreeItem rootNode, progNode, databaseNode; rootNode = new TreeItem<>("Tanulnivaló"); progNode = createNode("Programozás", rootNode); createNode("Java", progNode); createNode("Charp", progNode); databaseNode = createNode("Adatbázis", rootNode); createNode("MySQL", databaseNode); createNode("Mariadb", databaseNode); tree = new TreeView<>(rootNode); Button button = new Button("Vált"); button.setOnAction(e -> { if (tree.isShowRoot()) tree.setShowRoot(false); else tree.setShowRoot(true); }); VBox vbox = new VBox(10); vbox.setPadding(new Insets(10, 10, 10, 10)); vbox.getChildren().addAll(tree, button); Scene scene = new Scene(vbox, 300, 250); primaryStage.setScene(scene); primaryStage.show(); } public TreeItem createNode(String title, TreeItem parent) { TreeItem node = new TreeItem<>(title); parent.getChildren().add(node); return node; } } {{:oktatas:programozas:java:java_fx:javafx_tree_control.png|}} A csomópont nyitása, zárása a setExpanded() metódussal lehetséges. root.setExpanded(true); A csomópont nyitva, vagy zárva van-e: root.isExpanded() Melyik elem lett kijelölve: tree.getSelectionModel().selectedItemProperty().addListener((obj, odlNode, newNode) -> { if (newNode != null) { System.out.println(newNode.getValue()); } }); Még több: * https://docs.oracle.com/javase/8/javafx/user-interface-tutorial/tree-view.htm ===== Táblázat ===== ==== Megjelenítés táblázatban ==== A táblázathoz a következő osztályok szükségesek: * TableView * TableColumn * PropertyValueFactory * ObservableList * FXCollections Szükség van egy olyan osztályra, amiben tárolhatjuk a táblázat sorait. Legyen a példa kedvéért egy dolgozókat tároló osztály: public class Employee { String name; String city; double salary; public Employee(String name, String city, double salary) { this.name = name; this.city = city; this.salary = salary; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } } Szükségünk lesz, minden mező számára beállító és lekérdező (getter, setter) függvényekre. import javafx.application.Application; import javafx.collections.ObservableList; import javafx.scene.Scene; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.control.cell.PropertyValueFactory; import javafx.stage.Stage; import javafx.collections.FXCollections; public class App extends Application { private final TableView table = new TableView<>(); public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) throws Exception { TableColumn nameCol = new TableColumn<>("Név"); nameCol.setMinWidth(100); nameCol.setCellValueFactory(new PropertyValueFactory<>("name")); TableColumn cityCol = new TableColumn<>("Település"); cityCol.setMinWidth(100); cityCol.setCellValueFactory(new PropertyValueFactory<>("city")); TableColumn salaryCol = new TableColumn<>("Fizetés"); salaryCol.setMinWidth(100); salaryCol.setCellValueFactory(new PropertyValueFactory<>("salary")); table.setItems(getEmployees()); table.getColumns().add(nameCol); table.getColumns().add(cityCol); table.getColumns().add(salaryCol); Scene scene = new Scene(table, 302, 250); primaryStage.setScene(scene); primaryStage.show(); } private ObservableList getEmployees() { ObservableList employees = FXCollections.observableArrayList( new Employee("Poros Béla", "Szeged", 2870000), new Employee("Tér Irén", "Szeged", 2435000), new Employee("Pakos Péter", "Hatvan", 2530000), new Employee("Szu Emese", "Szolnok", 2270000)); return employees; } } {{:oktatas:programozas:java:java_fx:javafx_table_control_1.png|}} A táblázat mezőit a table.getColumns().addAll() függvénnyel is felvehetjük, de ez típusbiztonsági figyelmeztetést eredményez, mivel ismétlődő típusok argumentumlistáját adjuk át. Több kijelölhető sor beállítása: table.getSelectionModel().setSelectionMode( SelectionMode.MULTIPLE ); ==== Táblázat sorkezeléssel ==== public class Employee { String name; String city; Double salary; public Employee(String name, String city, double salary) { this.name = name; this.city = city; this.salary = salary; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public Double getSalary() { return salary; } public void setSalary(Double salary) { this.salary = salary; } } import javafx.application.Application; import javafx.collections.ObservableList; import javafx.geometry.Insets; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.control.TextField; import javafx.scene.control.cell.PropertyValueFactory; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import javafx.stage.Stage; import javafx.collections.FXCollections; public class App extends Application { private TableView table = new TableView<>(); private TextField nameInput, cityInput, salaryInput; public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) throws Exception { TableColumn nameCol = new TableColumn<>("Név"); nameCol.setMinWidth(100); nameCol.setCellValueFactory(new PropertyValueFactory<>("name")); TableColumn cityCol = new TableColumn<>("Település"); cityCol.setMinWidth(100); cityCol.setCellValueFactory(new PropertyValueFactory<>("city")); TableColumn salaryCol = new TableColumn<>("Fizetés"); salaryCol.setMinWidth(100); salaryCol.setCellValueFactory(new PropertyValueFactory<>("salary")); nameInput = new TextField(); nameInput.setPromptText("Név"); cityInput = new TextField(); cityInput.setPromptText("Település"); salaryInput = new TextField(); salaryInput.setPromptText("Fizetés"); Button addButton = new Button("Hozzáad"); addButton.setOnAction(e->onClickAddButton()); Button delButton = new Button("Törlés"); delButton.setOnAction(e->onClickDelButton()); HBox inputBox = new HBox(10); inputBox.setPadding(new Insets(10, 10, 10, 10)); inputBox.setSpacing(10); inputBox.getChildren().addAll( nameInput, cityInput, salaryInput ); HBox buttonBox = new HBox(10); buttonBox.setPadding(new Insets(10, 10, 10, 10)); buttonBox.setSpacing(10); buttonBox.getChildren().addAll( addButton, delButton ); VBox vbox = new VBox(); vbox.getChildren().addAll(table, inputBox, buttonBox); table.setItems(getEmployees()); table.getColumns().add(nameCol); table.getColumns().add(cityCol); table.getColumns().add(salaryCol); Scene scene = new Scene(vbox, 302, 250); primaryStage.setScene(scene); primaryStage.show(); } private void onClickAddButton() { String name = this.nameInput.getText(); String city = this.cityInput.getText(); double salary = Double.parseDouble(this.salaryInput.getText()); Employee employee = new Employee(name, city, salary); table.getItems().add(employee); this.nameInput.clear(); this.cityInput.clear(); this.salaryInput.clear(); } private void onClickDelButton() { ObservableList selectedEmployee, employees; employees = table.getItems(); selectedEmployee = table.getSelectionModel().getSelectedItems(); selectedEmployee.forEach(employees::remove); } private ObservableList getEmployees() { ObservableList employees = FXCollections.observableArrayList( new Employee("Poros Béla", "Szeged", 2870000), new Employee("Tér Irén", "Szeged", 2435000), new Employee("Pakos Péter", "Hatvan", 2530000), new Employee("Szu Emese", "Szolnok", 2270000)); return employees; } } {{:oktatas:programozas:java:java_fx:javafx_table_control.png|}} ==== Szerkeszthető cellák ==== Az Employee osztályban a salary mezőt beállító, lekérdező metódusokat átírtuk. A lekérő String típust ad vissza, a beállító String típust fogad, de átalakítja Double típussá. public class Employee { String name; String city; Double salary; public Employee(String name, String city, double salary) { this.name = name; this.city = city; this.salary = salary; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getSalary() { return salary.toString(); } public void setSalary(String salary) { this.salary = Double.parseDouble(salary); } } import javafx.application.Application; import javafx.collections.ObservableList; import javafx.geometry.Insets; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.control.TextField; import javafx.scene.control.cell.PropertyValueFactory; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import javafx.stage.Stage; import javafx.collections.FXCollections; import javafx.event.EventHandler; import javafx.scene.control.TableColumn.CellEditEvent; import javafx.scene.control.cell.TextFieldTableCell; public class App extends Application { private TableView table = new TableView<>(); private TextField nameInput, cityInput, salaryInput; public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) throws Exception { TableColumn nameCol = new TableColumn<>("Név"); nameCol.setMinWidth(100); nameCol.setCellValueFactory(new PropertyValueFactory<>("name")); TableColumn cityCol = new TableColumn<>("Település"); cityCol.setMinWidth(100); cityCol.setCellValueFactory(new PropertyValueFactory<>("city")); TableColumn salaryCol = new TableColumn<>("Fizetés"); salaryCol.setMinWidth(100); salaryCol.setCellValueFactory(new PropertyValueFactory<>("salary")); nameCol.setCellFactory( TextFieldTableCell.forTableColumn() ); cityCol.setCellFactory( TextFieldTableCell.forTableColumn() ); salaryCol.setCellFactory( TextFieldTableCell.forTableColumn() ); nameCol.setOnEditCommit( new EventHandler>() { @Override public void handle(CellEditEvent t) { ((Employee) t.getTableView().getItems().get( t.getTablePosition().getRow()) ).setName(t.getNewValue()); } } ); cityCol.setOnEditCommit( new EventHandler>() { @Override public void handle(CellEditEvent t) { ((Employee) t.getTableView().getItems().get( t.getTablePosition().getRow()) ).setCity(t.getNewValue()); } } ); salaryCol.setOnEditCommit( new EventHandler>() { @Override public void handle(CellEditEvent t) { ((Employee) t.getTableView().getItems().get( t.getTablePosition().getRow()) ).setSalary(t.getNewValue()); } } ); table.setEditable(true); nameInput = new TextField(); nameInput.setPromptText("Név"); cityInput = new TextField(); cityInput.setPromptText("Település"); salaryInput = new TextField(); salaryInput.setPromptText("Fizetés"); Button addButton = new Button("Hozzáad"); addButton.setOnAction(e->onClickAddButton()); Button delButton = new Button("Törlés"); delButton.setOnAction(e->onClickDelButton()); HBox inputBox = new HBox(10); inputBox.setPadding(new Insets(10, 10, 10, 10)); inputBox.setSpacing(10); inputBox.getChildren().addAll( nameInput, cityInput, salaryInput ); HBox buttonBox = new HBox(10); buttonBox.setPadding(new Insets(10, 10, 10, 10)); buttonBox.setSpacing(10); buttonBox.getChildren().addAll( addButton, delButton ); VBox vbox = new VBox(); vbox.getChildren().addAll(table, inputBox, buttonBox); table.setItems(getEmployees()); table.getColumns().add(nameCol); table.getColumns().add(cityCol); table.getColumns().add(salaryCol); Scene scene = new Scene(vbox, 302, 250); primaryStage.setScene(scene); primaryStage.show(); } private void onClickAddButton() { String name = this.nameInput.getText(); String city = this.cityInput.getText(); double salary = Double.parseDouble(this.salaryInput.getText()); Employee employee = new Employee(name, city, salary); table.getItems().add(employee); this.nameInput.clear(); this.cityInput.clear(); this.salaryInput.clear(); } private void onClickDelButton() { ObservableList selectedEmployee, employees; employees = table.getItems(); selectedEmployee = table.getSelectionModel().getSelectedItems(); selectedEmployee.forEach(employees::remove); } private ObservableList getEmployees() { ObservableList employees = FXCollections.observableArrayList( new Employee("Poros Béla", "Szeged", 2870000), new Employee("Tér Irén", "Szeged", 2435000), new Employee("Pakos Péter", "Hatvan", 2530000), new Employee("Szu Emese", "Szolnok", 2270000)); return employees; } } {{:oktatas:programozas:java:java_fx:javafx_editable_table.png|}} ===== GridPane ===== import javafx.application.Application; import javafx.geometry.Insets; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.TextField; import javafx.scene.layout.GridPane; public class App extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) throws Exception { GridPane grid = new GridPane(); grid.setVgap(10); grid.setHgap(10); grid.setPadding(new Insets(10, 10, 10, 10)); Label baseLabel = new Label("Alap: "); GridPane.setConstraints(baseLabel, 0, 0); TextField baseInput = new TextField(); GridPane.setConstraints(baseInput, 1, 0); Label heightLabel = new Label("Magasság: "); GridPane.setConstraints(heightLabel, 0, 1); TextField heightInput = new TextField(); GridPane.setConstraints(heightInput, 1, 1); Button calcButton = new Button("Számít"); GridPane.setConstraints(calcButton, 1, 2); grid.getChildren().addAll(baseLabel, baseInput, heightLabel, heightInput, calcButton); Scene scene = new Scene(grid, 300, 150); primaryStage.setScene(scene); primaryStage.show(); } } {{:oktatas:programozas:java:java_fx:javafx_gridpane_example.png|}} ===== Menü ===== ==== Menükészítés ==== import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.Menu; import javafx.scene.control.MenuBar; import javafx.scene.control.MenuItem; import javafx.scene.layout.BorderPane; import javafx.stage.Stage; public class App extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) throws Exception { Menu fileMenu = new Menu("Segítség"); fileMenu.getItems().add(new MenuItem("Tartalom")); fileMenu.getItems().add(new MenuItem("Névjegy")); MenuBar menuBar = new MenuBar(); menuBar.getMenus().addAll(fileMenu); BorderPane borderPane = new BorderPane(); borderPane.setTop(menuBar); Scene scene = new Scene(borderPane, 300, 250); primaryStage.setScene(scene); primaryStage.show(); } } {{:oktatas:programozas:java:java_fx:javafx_menu_01.png|}} ==== Menü eseménykezeléssel ==== import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.Menu; import javafx.scene.control.MenuBar; import javafx.scene.control.MenuItem; import javafx.scene.layout.BorderPane; import javafx.stage.Stage; public class App extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) throws Exception { MenuBar menuBar = new MenuBar(); Menu helpMenu = new Menu("Segítség"); MenuItem contentMenuItem = new MenuItem("Tartalom"); MenuItem aboutMenuItem = new MenuItem("Névjegy"); contentMenuItem.setOnAction(e->System.out.println("Tartalom")); aboutMenuItem.setOnAction(e->System.out.println("Névjegy")); helpMenu.getItems().addAll(contentMenuItem, aboutMenuItem); menuBar.getMenus().addAll(helpMenu); BorderPane borderPane = new BorderPane(); borderPane.setTop(menuBar); Scene scene = new Scene(borderPane, 300, 250); primaryStage.setScene(scene); primaryStage.show(); } } ==== Még több menü ==== import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.Menu; import javafx.scene.control.MenuBar; import javafx.scene.control.MenuItem; import javafx.scene.layout.BorderPane; import javafx.stage.Stage; public class App extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) throws Exception { MenuBar menuBar = new MenuBar(); Menu fileMenu = new Menu("Fájl"); Menu helpMenu = new Menu("Segítség"); MenuItem exitMenuItem = new MenuItem("Kilépés"); MenuItem contentMenuItem = new MenuItem("Tartalom"); MenuItem aboutMenuItem = new MenuItem("Névjegy"); exitMenuItem.setOnAction(e->primaryStage.close()); contentMenuItem.setOnAction(e->System.out.println("Tartalom")); aboutMenuItem.setOnAction(e->System.out.println("Névjegy")); fileMenu.getItems().addAll(exitMenuItem); helpMenu.getItems().addAll(contentMenuItem, aboutMenuItem); menuBar.getMenus().addAll(fileMenu, helpMenu); BorderPane borderPane = new BorderPane(); borderPane.setTop(menuBar); Scene scene = new Scene(borderPane, 300, 250); primaryStage.setScene(scene); primaryStage.show(); } } ===== TabPane ===== TabPane tabPane = new TabPane(); Tab tab1 = new Tab("Nevek"); Tab tab2 = new Tab("Csoportok"); Tab tab3 = new Tab("Tárgyak"); tabPane.getTabs().add(tab1); tabPane.getTabs().add(tab2); tabPane.getTabs().add(tab3); A fülek felirata és tartalma beállítható metódussal: tab1.setText("Valami"); tab1.setContent(vbox1); Fülek a panelhez egyetlen metódussal: tabPane.getTabs().addAll(tab1, tab2); Teljes kód: import javafx.application.Application; import javafx.geometry.Insets; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.control.Tab; import javafx.scene.control.TabPane; import javafx.scene.layout.VBox; public class App extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) { TabPane tabPane = new TabPane(); Tab tab1 = new Tab("Nevek"); Tab tab2 = new Tab("Csoportok"); Tab tab3 = new Tab("Tárgyak"); tabPane.getTabs().add(tab1); tabPane.getTabs().add(tab2); tabPane.getTabs().add(tab3); VBox vbox = new VBox(tabPane); vbox.setPadding(new Insets(10, 10, 10, 10)); vbox.setSpacing(10); Scene scene = new Scene(vbox, 300, 250); primaryStage.setScene(scene); primaryStage.setTitle("Valami"); primaryStage.show(); } } {{:oktatas:programozas:java:java_fx:tabpane_example1.png|}} ==== Feliratok ==== TabPane tabPane = new TabPane(); Tab tab1 = new Tab("Nevek", new Label("Nevek megjelenítése")); Tab tab2 = new Tab("Csoportok", new Label("Csoportok megjelenítése")); Tab tab3 = new Tab("Tárgyak", new Label("Tárgyak megjelenítése")); tabPane.getTabs().add(tab1); tabPane.getTabs().add(tab2); tabPane.getTabs().add(tab3); {{:oktatas:programozas:java:java_fx:tabpane_example2.png|}} ==== Gombok a fülön ==== A füleken (tab) elhelyezhető elrendezéskezelő is. Ebben a példában az első fülön egy VBox elrendezéskezelőn két gombot helyeztünk el: import javafx.application.Application; import javafx.geometry.Insets; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.Tab; import javafx.scene.control.TabPane; import javafx.scene.layout.VBox; public class App extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) { Button tab1Button1 = new Button("Mehet"); Button tab1Button2 = new Button("Jöhet"); VBox tab1Vbox = new VBox(); tab1Vbox.setPadding(new Insets(10, 10, 10, 10)); tab1Vbox.setSpacing(10); tab1Vbox.getChildren().add(tab1Button1); tab1Vbox.getChildren().add(tab1Button2); TabPane tabPane = new TabPane(); Tab tab1 = new Tab("Nevek", tab1Vbox); Tab tab2 = new Tab("Csoportok", new Label("Csoportok megjelenítése")); Tab tab3 = new Tab("Tárgyak", new Label("Tárgyak megjelenítése")); tabPane.getTabs().add(tab1); tabPane.getTabs().add(tab2); tabPane.getTabs().add(tab3); VBox vbox = new VBox(tabPane); vbox.setPadding(new Insets(10, 10, 10, 10)); vbox.setSpacing(10); Scene scene = new Scene(vbox, 300, 250); primaryStage.setScene(scene); primaryStage.setTitle("Valami"); primaryStage.show(); } } {{:oktatas:programozas:java:java_fx:tabpane_example3.png|}} ===== Hibás feladatok ===== ==== Két gomb ==== A következő program két gombot jelenít meg. Az felső gomb kattintásra ki kellene írja: "1-s gomb kattintás". Az alsó gomb kattintásra ki kellene írja: "2-s gomb kattintás". Azonban a felső gombra kattintásnál ezt írj ki: "2-s gomb kattintás". Az alsó gombra kattintva nem történik semmi. Hol a hiba? import javafx.application.Application; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.layout.StackPane; import javafx.scene.layout.VBox; public class App extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage stage) { Button button1 = new Button("Felső"); Button button2 = new Button("Alsó"); button1.setOnAction(e -> onButton1Click()); button1.setOnAction(e -> onButton2Click()); StackPane root = new StackPane(); VBox vbox = new VBox(10); vbox.getChildren().addAll(button1, button2); root.getChildren().add(vbox); Scene scene = new Scene(root, 300, 250); stage.setScene(scene); stage.setTitle("Valami"); stage.show(); } private void onButton1Click() { System.out.println("1-s gomb kattintás"); } private void onButton2Click() { System.out.println("2-s gomb kattintás"); } } ===== Függelék ===== ==== Label képpel ==== Teljes kód: import java.io.FileInputStream; import java.io.FileNotFoundException; import javafx.application.Application; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.control.Label; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.text.Font; public class App extends Application { public static void main(String[] args) { launch(args); } private ImageView getImage() { ImageView imageView = null; try { imageView = tryGetImage(); } catch (Exception e) { System.err.println("Hiba! A fájl nem található"); } return imageView; } private ImageView tryGetImage() throws FileNotFoundException{ String iconPath = "resources/images/kep02.png"; FileInputStream input = new FileInputStream(iconPath); Image image = new Image(input); ImageView imageView = new ImageView(image); return imageView; } @Override public void start(Stage stage) { Label label = new Label("Helló", getImage()); label.setFont(new Font("Arial", 24)); Scene scene = new Scene(label, 300, 250); stage.setScene(scene); stage.setTitle("Valami"); stage.show(); } } A fájlbetöltése itt átkerült külön metódusba. ==== Gomb lambda eseménykezeléssel ==== import javafx.application.Application; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.layout.StackPane; public class App extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage stage) { Button button = new Button("Mehet"); button.setOnAction(e -> onButtonClick()); StackPane root = new StackPane(); root.getChildren().add(button); Scene scene = new Scene(root, 300, 250); stage.setScene(scene); stage.setTitle("Valami"); stage.show(); } private void onButtonClick() { System.out.println("Kattintás volt"); } } ===== Linkek ===== * https://openjfx.io/ (2023) * https://openjfx.io/javadoc/19/javafx.controls/javafx/scene/control/Alert.html (2022) * https://docs.oracle.com/javafx/2/ (2023) * https://controlsfx.github.io/ (2023) * http://fxexperience.com/controlsfx/features/ (2023) Tutorial: * https://jenkov.com/tutorials/javafx/index.html (2022) TableBox: * https://docs.oracle.com/javase/8/javafx/user-interface-tutorial/table-view.htm (2021) * https://docs.oracle.com/javafx/2/ui_controls/table-view.htm (2021) * https://dzone.com/articles/editable-tables-in-javafx (2021) * http://tutorials.jenkov.com/javafx/tableview.html (2021)