From 0817ee3dbf45bf836275f4f1b632cbd99cc3f991 Mon Sep 17 00:00:00 2001 From: Haidar Ali Date: Mon, 30 Jun 2025 15:49:26 +0500 Subject: [PATCH 1/7] [BAEL-6602] Copying text to clipboard in Java --- core-java-modules/core-java-swing/pom.xml | 8 +++- .../com/baeldung/clipboard/AwtClipboard.java | 39 +++++++++++++++++++ 2 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 core-java-modules/core-java-swing/src/main/java/com/baeldung/clipboard/AwtClipboard.java diff --git a/core-java-modules/core-java-swing/pom.xml b/core-java-modules/core-java-swing/pom.xml index 462e31e439f5..d7e481b0fc0e 100644 --- a/core-java-modules/core-java-swing/pom.xml +++ b/core-java-modules/core-java-swing/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 core-java-swing jar @@ -19,4 +19,8 @@ UTF-8 + + src/main/java + + \ No newline at end of file diff --git a/core-java-modules/core-java-swing/src/main/java/com/baeldung/clipboard/AwtClipboard.java b/core-java-modules/core-java-swing/src/main/java/com/baeldung/clipboard/AwtClipboard.java new file mode 100644 index 000000000000..3d3959fa80e2 --- /dev/null +++ b/core-java-modules/core-java-swing/src/main/java/com/baeldung/clipboard/AwtClipboard.java @@ -0,0 +1,39 @@ +package com.baeldung.clipboard; + +import java.awt.Toolkit; +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.StringSelection; +import java.awt.datatransfer.Transferable; +import java.awt.datatransfer.UnsupportedFlavorException; +import java.io.IOException; +import java.awt.datatransfer.DataFlavor; + +public class AwtClipboard { + + public static void main(String[] args) throws IOException, UnsupportedFlavorException { + String textToCopy = "Baeldung helps developers explore the Java ecosystem and simply be better engineers."; + copyToClipboard(textToCopy); + + String textCopied = copyFromClipboard(); + if (textCopied != null) { + System.out.println(textCopied); + } + } + + public static void copyToClipboard(String text) { + Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard(); + StringSelection data = new StringSelection(text); + cb.setContents(data, null); + } + + public static String copyFromClipboard() throws UnsupportedFlavorException, IOException { + Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard(); + Transferable transferable = cb.getContents(null); + if (transferable.isDataFlavorSupported(DataFlavor.stringFlavor)) { + String data = (String) transferable.getTransferData(DataFlavor.stringFlavor); + return data; + } + System.out.println("Couldn't get data from the clipboard"); + return null; + } +} \ No newline at end of file From b8fbd5dc1e7b429ba51548f1d11b0736cd7b9c35 Mon Sep 17 00:00:00 2001 From: Haidar Ali Date: Tue, 30 Sep 2025 18:22:11 +0500 Subject: [PATCH 2/7] [BAEL-5774] Constructor vs. initialize() in JavaFX --- .../controller/ControllerAnnotation.java | 22 ++++++++++++++++ .../controller/ControllerInitializable.java | 26 +++++++++++++++++++ javafx/src/main/resources/app_name_label.fxml | 8 ++++++ 3 files changed, 56 insertions(+) create mode 100644 javafx/src/main/java/com/baeldung/controller/ControllerAnnotation.java create mode 100644 javafx/src/main/java/com/baeldung/controller/ControllerInitializable.java create mode 100644 javafx/src/main/resources/app_name_label.fxml diff --git a/javafx/src/main/java/com/baeldung/controller/ControllerAnnotation.java b/javafx/src/main/java/com/baeldung/controller/ControllerAnnotation.java new file mode 100644 index 000000000000..d908cbd10b5e --- /dev/null +++ b/javafx/src/main/java/com/baeldung/controller/ControllerAnnotation.java @@ -0,0 +1,22 @@ +package com.baeldung.controller; + +package com.baeldung.controller; + +import javafx.fxml.FXML; +import javafx.scene.control.Label; + +public class ExampleController implements Initializable { + private final String appName; + + @FXML + private Label appNameLabel; + + public ExampleController(String name) { + this.appName = name; + } + + @FXML + public void initialize() { + this.appNameLabel.setText(this.appName); + } +} \ No newline at end of file diff --git a/javafx/src/main/java/com/baeldung/controller/ControllerInitializable.java b/javafx/src/main/java/com/baeldung/controller/ControllerInitializable.java new file mode 100644 index 000000000000..0670adac0e8d --- /dev/null +++ b/javafx/src/main/java/com/baeldung/controller/ControllerInitializable.java @@ -0,0 +1,26 @@ +package com.baeldung.controller; + +package com.baeldung.controller; + +import java.net.URL; +import java.util.ResourceBundle; + +import javafx.fxml.FXML; +import javafx.fxml.Initializable; +import javafx.scene.control.Label; + +public class ExampleController implements Initializable { + private final String appName; + + @FXML + private Label appNameLabel; + + public ExampleController(String name) { + this.appName = name; + } + + @Override + public void initialize(URL location, ResourceBundle res) { + this.appNameLabel.setText(this.appName); + } +} \ No newline at end of file diff --git a/javafx/src/main/resources/app_name_label.fxml b/javafx/src/main/resources/app_name_label.fxml new file mode 100644 index 000000000000..153ae071dfa3 --- /dev/null +++ b/javafx/src/main/resources/app_name_label.fxml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file From 6bb7b30e8ed586618051fa8b5204066eaef4bb12 Mon Sep 17 00:00:00 2001 From: Haidar Ali Date: Sun, 5 Oct 2025 18:10:22 +0500 Subject: [PATCH 3/7] [BAEL-5774] fix: classes and contructor names --- .../java/com/baeldung/controller/ControllerAnnotation.java | 6 ++---- .../com/baeldung/controller/ControllerInitializable.java | 6 ++---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/javafx/src/main/java/com/baeldung/controller/ControllerAnnotation.java b/javafx/src/main/java/com/baeldung/controller/ControllerAnnotation.java index d908cbd10b5e..e3a814435cd0 100644 --- a/javafx/src/main/java/com/baeldung/controller/ControllerAnnotation.java +++ b/javafx/src/main/java/com/baeldung/controller/ControllerAnnotation.java @@ -1,17 +1,15 @@ package com.baeldung.controller; -package com.baeldung.controller; - import javafx.fxml.FXML; import javafx.scene.control.Label; -public class ExampleController implements Initializable { +public class ControllerAnnotation { private final String appName; @FXML private Label appNameLabel; - public ExampleController(String name) { + public ControllerAnnotation(String name) { this.appName = name; } diff --git a/javafx/src/main/java/com/baeldung/controller/ControllerInitializable.java b/javafx/src/main/java/com/baeldung/controller/ControllerInitializable.java index 0670adac0e8d..13c4ffb37860 100644 --- a/javafx/src/main/java/com/baeldung/controller/ControllerInitializable.java +++ b/javafx/src/main/java/com/baeldung/controller/ControllerInitializable.java @@ -1,7 +1,5 @@ package com.baeldung.controller; -package com.baeldung.controller; - import java.net.URL; import java.util.ResourceBundle; @@ -9,13 +7,13 @@ import javafx.fxml.Initializable; import javafx.scene.control.Label; -public class ExampleController implements Initializable { +public class ControllerInitializable implements Initializable { private final String appName; @FXML private Label appNameLabel; - public ExampleController(String name) { + public ControllerInitializable(String name) { this.appName = name; } From 532c47b10d6bc06a722eb923b13c74ed4e8fc02f Mon Sep 17 00:00:00 2001 From: Haidar Ali Date: Mon, 27 Oct 2025 20:32:07 +0500 Subject: [PATCH 4/7] [BAEL-5774] Updated class names in accordance to the article --- .../controller/ControllerInitializable.java | 24 -------- .../baeldung/controller/MainController.java | 53 ++++++++++++++++++ .../controller/ProfileController.java | 56 +++++++++++++++++++ javafx/src/main/resources/status_label.fxml | 8 +++ 4 files changed, 117 insertions(+), 24 deletions(-) delete mode 100644 javafx/src/main/java/com/baeldung/controller/ControllerInitializable.java create mode 100644 javafx/src/main/java/com/baeldung/controller/MainController.java create mode 100644 javafx/src/main/java/com/baeldung/controller/ProfileController.java create mode 100644 javafx/src/main/resources/status_label.fxml diff --git a/javafx/src/main/java/com/baeldung/controller/ControllerInitializable.java b/javafx/src/main/java/com/baeldung/controller/ControllerInitializable.java deleted file mode 100644 index 13c4ffb37860..000000000000 --- a/javafx/src/main/java/com/baeldung/controller/ControllerInitializable.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.baeldung.controller; - -import java.net.URL; -import java.util.ResourceBundle; - -import javafx.fxml.FXML; -import javafx.fxml.Initializable; -import javafx.scene.control.Label; - -public class ControllerInitializable implements Initializable { - private final String appName; - - @FXML - private Label appNameLabel; - - public ControllerInitializable(String name) { - this.appName = name; - } - - @Override - public void initialize(URL location, ResourceBundle res) { - this.appNameLabel.setText(this.appName); - } -} \ No newline at end of file diff --git a/javafx/src/main/java/com/baeldung/controller/MainController.java b/javafx/src/main/java/com/baeldung/controller/MainController.java new file mode 100644 index 000000000000..ee4825e6a9b8 --- /dev/null +++ b/javafx/src/main/java/com/baeldung/controller/MainController.java @@ -0,0 +1,53 @@ +package com.baeldung.controller; + +import java.net.URL; +import java.util.ResourceBundle; + +import javafx.fxml.FXML; +import javafx.fxml.Initializable; +import javafx.scene.control.Label; + +public class MainController implements Initializable { + + private final Logger logger; + private final MetricsCollector metrics; + private final String appName; + + @FXML + private Label statusLabel; + + @FXML + private Label appNameLabel; + + public MainController(String name) { + this.logger = Logger.getLogger(DashboardController.class.getName()); + this.metrics = new MetricsCollector("dashboard-controller"); + this.appName = name; + + logger.info("DashboardController created"); + metrics.incrementCounter("controller.instances"); + } + + @Override + public void initialize(URL location, ResourceBundle resources) { + this.appNameLabel.setText(this.appName); + this.statusLabel.setText("App is ready!"); + logger.info("UI initialized successfully"); + } + + // Placeholder classes for demo + static class Logger { + private final String name; + private Logger(String name) { this.name = name; } + public static Logger getLogger(String name) { return new Logger(name); } + public void info(String msg) { System.out.println("[INFO] " + msg); } + } + + static class MetricsCollector { + private final String source; + public MetricsCollector(String source) { this.source = source; } + public void incrementCounter(String key) { + System.out.println("Metric incremented: " + key + " (source: " + source + ")"); + } + } +} \ No newline at end of file diff --git a/javafx/src/main/java/com/baeldung/controller/ProfileController.java b/javafx/src/main/java/com/baeldung/controller/ProfileController.java new file mode 100644 index 000000000000..a32e7f764864 --- /dev/null +++ b/javafx/src/main/java/com/baeldung/controller/ProfileController.java @@ -0,0 +1,56 @@ +package com.baeldung.controller; + +import java.net.URL; +import java.util.ResourceBundle; + +import javafx.fxml.FXML; +import javafx.fxml.Initializable; +import javafx.scene.control.Label; + +public class ProfileController implements Initializable { + + private final UserService userService; + private User currentUser; + + @FXML + private Label usernameLabel; + + public ProfileController(UserService userService) { + this.currentUser = userService.getCurrentUser(); + } + + @Override + public void initialize(URL location, ResourceBundle resources) { + usernameLabel.setText("Welcome, " + this.currentUser.getName()); + } + + // Placeholder classes for demo + static class UserService { + private final User user = new User(); + + UserService() { + this.user = new User(); + this.user.setName("Baeldung"); + } + + public User getCurrentUser() { + return this.user; + } + } + + static class User { + private String name; + + public User(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + } +} \ No newline at end of file diff --git a/javafx/src/main/resources/status_label.fxml b/javafx/src/main/resources/status_label.fxml new file mode 100644 index 000000000000..5384c01831c3 --- /dev/null +++ b/javafx/src/main/resources/status_label.fxml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file From b2afb7960547b125ab94c17f459592e280f18fdb Mon Sep 17 00:00:00 2001 From: Haidar Ali Date: Tue, 28 Oct 2025 00:20:29 +0500 Subject: [PATCH 5/7] [BAEL-5774] Proper arguments for MetricsCollector and User constructors --- .../src/main/java/com/baeldung/controller/MainController.java | 2 +- .../main/java/com/baeldung/controller/ProfileController.java | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/javafx/src/main/java/com/baeldung/controller/MainController.java b/javafx/src/main/java/com/baeldung/controller/MainController.java index ee4825e6a9b8..b5b59198a9c3 100644 --- a/javafx/src/main/java/com/baeldung/controller/MainController.java +++ b/javafx/src/main/java/com/baeldung/controller/MainController.java @@ -20,7 +20,7 @@ public class MainController implements Initializable { private Label appNameLabel; public MainController(String name) { - this.logger = Logger.getLogger(DashboardController.class.getName()); + this.logger = Logger.getLogger(MainController.class.getName()); this.metrics = new MetricsCollector("dashboard-controller"); this.appName = name; diff --git a/javafx/src/main/java/com/baeldung/controller/ProfileController.java b/javafx/src/main/java/com/baeldung/controller/ProfileController.java index a32e7f764864..045d63bcfa13 100644 --- a/javafx/src/main/java/com/baeldung/controller/ProfileController.java +++ b/javafx/src/main/java/com/baeldung/controller/ProfileController.java @@ -26,11 +26,10 @@ public void initialize(URL location, ResourceBundle resources) { // Placeholder classes for demo static class UserService { - private final User user = new User(); + private final User user = new User("Baledung"); UserService() { this.user = new User(); - this.user.setName("Baeldung"); } public User getCurrentUser() { From 2b132ea9a535eb14e28e1dd4baffcb8c6a54ecfc Mon Sep 17 00:00:00 2001 From: Haidar Ali Date: Tue, 28 Oct 2025 00:33:25 +0500 Subject: [PATCH 6/7] [BAEL-5774] userService properly initialized --- .../main/java/com/baeldung/controller/ProfileController.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/javafx/src/main/java/com/baeldung/controller/ProfileController.java b/javafx/src/main/java/com/baeldung/controller/ProfileController.java index 045d63bcfa13..6d573f49529a 100644 --- a/javafx/src/main/java/com/baeldung/controller/ProfileController.java +++ b/javafx/src/main/java/com/baeldung/controller/ProfileController.java @@ -16,6 +16,7 @@ public class ProfileController implements Initializable { private Label usernameLabel; public ProfileController(UserService userService) { + this.userService = userService; this.currentUser = userService.getCurrentUser(); } @@ -26,10 +27,10 @@ public void initialize(URL location, ResourceBundle resources) { // Placeholder classes for demo static class UserService { - private final User user = new User("Baledung"); + private final User user; UserService() { - this.user = new User(); + this.user = new User("Baeldung"); } public User getCurrentUser() { From 6d0848e54a98b814ca07ea713888cd480b8d4a77 Mon Sep 17 00:00:00 2001 From: Haidar Ali Date: Sat, 15 Nov 2025 18:44:12 +0500 Subject: [PATCH 7/7] [BAEL-5774] Moved the snippets to a standalone javafx-2 module --- javafx-2/pom.xml | 46 +++++++++++++++ javafx-2/src/main/java/com/baeldung/Main.java | 32 +++++++++++ .../controller/ControllerAnnotation.java | 20 +++++++ .../baeldung/controller/MainController.java | 53 ++++++++++++++++++ .../controller/ProfileController.java | 56 +++++++++++++++++++ .../src/main/resources/app_name_label.fxml | 8 +++ javafx-2/src/main/resources/status_label.fxml | 8 +++ pom.xml | 2 + 8 files changed, 225 insertions(+) create mode 100644 javafx-2/pom.xml create mode 100644 javafx-2/src/main/java/com/baeldung/Main.java create mode 100644 javafx-2/src/main/java/com/baeldung/controller/ControllerAnnotation.java create mode 100644 javafx-2/src/main/java/com/baeldung/controller/MainController.java create mode 100644 javafx-2/src/main/java/com/baeldung/controller/ProfileController.java create mode 100644 javafx-2/src/main/resources/app_name_label.fxml create mode 100644 javafx-2/src/main/resources/status_label.fxml diff --git a/javafx-2/pom.xml b/javafx-2/pom.xml new file mode 100644 index 000000000000..6f86653f864b --- /dev/null +++ b/javafx-2/pom.xml @@ -0,0 +1,46 @@ + + + 4.0.0 + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + javafx-2 + jar + javafx-2 + + + + org.openjfx + javafx-controls + ${javafx.version} + + + org.openjfx + javafx-fxml + ${javafx.version} + + + + + + + org.openjfx + javafx-maven-plugin + ${javafx-maven-plugin.version} + + com.baeldung.javafx2.Main + + + + + + + 19 + 0.0.8 + + \ No newline at end of file diff --git a/javafx-2/src/main/java/com/baeldung/Main.java b/javafx-2/src/main/java/com/baeldung/Main.java new file mode 100644 index 000000000000..e4d3b8f426be --- /dev/null +++ b/javafx-2/src/main/java/com/baeldung/Main.java @@ -0,0 +1,32 @@ +package com.baeldung; + +import javafx.application.Application; +import javafx.fxml.FXMLLoader; +import javafx.scene.Parent; +import javafx.scene.Scene; +import javafx.scene.control.Label; +import javafx.scene.layout.AnchorPane; +import javafx.stage.Stage; +import java.io.IOException; + +public class Main extends Application { + + public static void main(String[] args) { + launch(args); + } + + @Override + public void start(Stage primaryStage) throws Exception { + try { + FXMLLoader loader = new FXMLLoader(getClass().getResource("app-label.fxml")); + Parent root = loader.load(); + primaryStage.setScene(new Scene(root)); + } catch (IOException e) { + System.err.println("View failed to load: " + e.getMessage()); + primaryStage.setScene(new Scene(new Label("UI failed to load"))); + } + + primaryStage.setTitle("Title goes here"); + primaryStage.show(); + } +} diff --git a/javafx-2/src/main/java/com/baeldung/controller/ControllerAnnotation.java b/javafx-2/src/main/java/com/baeldung/controller/ControllerAnnotation.java new file mode 100644 index 000000000000..e3a814435cd0 --- /dev/null +++ b/javafx-2/src/main/java/com/baeldung/controller/ControllerAnnotation.java @@ -0,0 +1,20 @@ +package com.baeldung.controller; + +import javafx.fxml.FXML; +import javafx.scene.control.Label; + +public class ControllerAnnotation { + private final String appName; + + @FXML + private Label appNameLabel; + + public ControllerAnnotation(String name) { + this.appName = name; + } + + @FXML + public void initialize() { + this.appNameLabel.setText(this.appName); + } +} \ No newline at end of file diff --git a/javafx-2/src/main/java/com/baeldung/controller/MainController.java b/javafx-2/src/main/java/com/baeldung/controller/MainController.java new file mode 100644 index 000000000000..b5b59198a9c3 --- /dev/null +++ b/javafx-2/src/main/java/com/baeldung/controller/MainController.java @@ -0,0 +1,53 @@ +package com.baeldung.controller; + +import java.net.URL; +import java.util.ResourceBundle; + +import javafx.fxml.FXML; +import javafx.fxml.Initializable; +import javafx.scene.control.Label; + +public class MainController implements Initializable { + + private final Logger logger; + private final MetricsCollector metrics; + private final String appName; + + @FXML + private Label statusLabel; + + @FXML + private Label appNameLabel; + + public MainController(String name) { + this.logger = Logger.getLogger(MainController.class.getName()); + this.metrics = new MetricsCollector("dashboard-controller"); + this.appName = name; + + logger.info("DashboardController created"); + metrics.incrementCounter("controller.instances"); + } + + @Override + public void initialize(URL location, ResourceBundle resources) { + this.appNameLabel.setText(this.appName); + this.statusLabel.setText("App is ready!"); + logger.info("UI initialized successfully"); + } + + // Placeholder classes for demo + static class Logger { + private final String name; + private Logger(String name) { this.name = name; } + public static Logger getLogger(String name) { return new Logger(name); } + public void info(String msg) { System.out.println("[INFO] " + msg); } + } + + static class MetricsCollector { + private final String source; + public MetricsCollector(String source) { this.source = source; } + public void incrementCounter(String key) { + System.out.println("Metric incremented: " + key + " (source: " + source + ")"); + } + } +} \ No newline at end of file diff --git a/javafx-2/src/main/java/com/baeldung/controller/ProfileController.java b/javafx-2/src/main/java/com/baeldung/controller/ProfileController.java new file mode 100644 index 000000000000..6d573f49529a --- /dev/null +++ b/javafx-2/src/main/java/com/baeldung/controller/ProfileController.java @@ -0,0 +1,56 @@ +package com.baeldung.controller; + +import java.net.URL; +import java.util.ResourceBundle; + +import javafx.fxml.FXML; +import javafx.fxml.Initializable; +import javafx.scene.control.Label; + +public class ProfileController implements Initializable { + + private final UserService userService; + private User currentUser; + + @FXML + private Label usernameLabel; + + public ProfileController(UserService userService) { + this.userService = userService; + this.currentUser = userService.getCurrentUser(); + } + + @Override + public void initialize(URL location, ResourceBundle resources) { + usernameLabel.setText("Welcome, " + this.currentUser.getName()); + } + + // Placeholder classes for demo + static class UserService { + private final User user; + + UserService() { + this.user = new User("Baeldung"); + } + + public User getCurrentUser() { + return this.user; + } + } + + static class User { + private String name; + + public User(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + } +} \ No newline at end of file diff --git a/javafx-2/src/main/resources/app_name_label.fxml b/javafx-2/src/main/resources/app_name_label.fxml new file mode 100644 index 000000000000..153ae071dfa3 --- /dev/null +++ b/javafx-2/src/main/resources/app_name_label.fxml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/javafx-2/src/main/resources/status_label.fxml b/javafx-2/src/main/resources/status_label.fxml new file mode 100644 index 000000000000..5384c01831c3 --- /dev/null +++ b/javafx-2/src/main/resources/status_label.fxml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index f89c71668310..4e93d2c376c4 100644 --- a/pom.xml +++ b/pom.xml @@ -677,6 +677,7 @@ java-jdi java-panama javafx + javafx-2 javax-sound javaxval javaxval-2 @@ -1120,6 +1121,7 @@ java-jdi java-panama javafx + javafx-2 javax-sound javaxval javaxval-2