© Excellent backgrounds/Shutterstock.com
Java Magazin
Swing Controls in JavaFX umschreiben

Swing Controls in JavaFX umschreiben

Oracle hat die Stimmen aus der Entwicklergemeinde erhört und stellt ab sofort mit SwingNode eine Node im JavaFX Scene Graph zur Verfügung, die die Migration von Java-Swing-Anwendungen nach JavaFX erheblich erleichtern soll. Ein kurzer Überblick.

Gerrit Grunwald


Da JavaFX langsam auch für Non Early Adopter interessant wird, stellt sich die Frage der Migration von bestehenden Java-Swing-Anwendungen nach JavaFX. Bislang gab es als Antwort lediglich das JFXPanel. Dabei handelt es sich um die Möglichkeit, JavaFX in Java-Swing-Anwendungen zu integrieren. Das JFXPanel verhält sich dabei wie ein JPanel für Swing, kann jedoch eine JavaFX Scene darstellen. Diese Möglichkeit ist zwar interessant, aber leider nicht das, was sich die Entwickler gewünscht hätten. Üblicherweise bestehen die Swing-Anwendungen im Feld aus einer Vielzahl eigener, sehr komplexer Controls, die man nur sehr ungern auf einmal in JavaFX umschreiben möchte. Für eine „sanfte“ Migration wünscht man sich eher den umgekehrten Weg, sprich: Man möchte gerne eine neue JavaFX-Anwendung aufsetzen und dann die mühsam erstellten Swing-Komponenten in JavaFX integrieren. Mit diesem Ansatz ist es dann möglich, langsam die bestehenden Swing Controls in JavaFX umzuschreiben.

Glücklicherweise hat Oracle hier auf die Nachfrage der Entwicklergemeinde gehört und diesen Migrationspfad mit der so genannten SwingNode zur Verfügung gestellt. Diese stellt eine Node im Scene Graph dar, die die Fähigkeit hat, Swing-Komponenten auf der Basis von JComponent zu rendern.

Bei beiden Migrationspfaden muss man aber immer bedenken, dass man es hier mit zwei unabhängigen Rendering-Threads zu tun hat, die synchronisiert sein wollen. JavaFX kommt hier mit dem FX Application Thread und Swing mit dem Event Dispatch Thread daher. Da beide Threads vollkommen unabhängig voneinander sind, muss der Entwickler dafür sorgen, dass Interaktionen zwischen ihnen über die entsprechenden Methoden in den jeweiligen Thread „eingefüttert“ werden. In JavaFX verwendet man hierzu die Methode

Platform.runLater(new Runnable() { @Override public void run() { // Your code here }});

und in Java Swing

SwingUtilities.invokeLater(new Runnable() { @Override public void run() { // Your code here }});

Als einfaches Beispiel soll nun in Listing 1 ein Java Swing JButton in eine JavaFX SwingNode eingebettet werden und durch Drücken einen Text in einem JavaFX Label umschalten.

Listing 1public class Migration extends Application { private Label javaFxLabel; private Button javaFxButton; private JLabel swingLabel; private JButton swingButton;  @Override public void init() { javaFxLabel = new Label("No Button pressed"); javaFxButton = new Button("click JavaFX"); javaFxButton.setOnAction(new EventHandl...

Java Magazin
Swing Controls in JavaFX umschreiben

Swing Controls in JavaFX umschreiben

Oracle hat die Stimmen aus der Entwicklergemeinde erhört und stellt ab sofort mit SwingNode eine Node im JavaFX Scene Graph zur Verfügung, die die Migration von Java-Swing-Anwendungen nach JavaFX erheblich erleichtern soll. Ein kurzer Überblick.

Gerrit Grunwald


Da JavaFX langsam auch für Non Early Adopter interessant wird, stellt sich die Frage der Migration von bestehenden Java-Swing-Anwendungen nach JavaFX. Bislang gab es als Antwort lediglich das JFXPanel. Dabei handelt es sich um die Möglichkeit, JavaFX in Java-Swing-Anwendungen zu integrieren. Das JFXPanel verhält sich dabei wie ein JPanel für Swing, kann jedoch eine JavaFX Scene darstellen. Diese Möglichkeit ist zwar interessant, aber leider nicht das, was sich die Entwickler gewünscht hätten. Üblicherweise bestehen die Swing-Anwendungen im Feld aus einer Vielzahl eigener, sehr komplexer Controls, die man nur sehr ungern auf einmal in JavaFX umschreiben möchte. Für eine „sanfte“ Migration wünscht man sich eher den umgekehrten Weg, sprich: Man möchte gerne eine neue JavaFX-Anwendung aufsetzen und dann die mühsam erstellten Swing-Komponenten in JavaFX integrieren. Mit diesem Ansatz ist es dann möglich, langsam die bestehenden Swing Controls in JavaFX umzuschreiben.

Glücklicherweise hat Oracle hier auf die Nachfrage der Entwicklergemeinde gehört und diesen Migrationspfad mit der so genannten SwingNode zur Verfügung gestellt. Diese stellt eine Node im Scene Graph dar, die die Fähigkeit hat, Swing-Komponenten auf der Basis von JComponent zu rendern.

Bei beiden Migrationspfaden muss man aber immer bedenken, dass man es hier mit zwei unabhängigen Rendering-Threads zu tun hat, die synchronisiert sein wollen. JavaFX kommt hier mit dem FX Application Thread und Swing mit dem Event Dispatch Thread daher. Da beide Threads vollkommen unabhängig voneinander sind, muss der Entwickler dafür sorgen, dass Interaktionen zwischen ihnen über die entsprechenden Methoden in den jeweiligen Thread „eingefüttert“ werden. In JavaFX verwendet man hierzu die Methode

Platform.runLater(new Runnable() { @Override public void run() { // Your code here }});

und in Java Swing

SwingUtilities.invokeLater(new Runnable() { @Override public void run() { // Your code here }});

Als einfaches Beispiel soll nun in Listing 1 ein Java Swing JButton in eine JavaFX SwingNode eingebettet werden und durch Drücken einen Text in einem JavaFX Label umschalten.

Listing 1public class Migration extends Application { private Label javaFxLabel; private Button javaFxButton; private JLabel swingLabel; private JButton swingButton;  @Override public void init() { javaFxLabel = new Label("No Button pressed"); javaFxButton = new Button("click JavaFX"); javaFxButton.setOnAction(new EventHandl...

Neugierig geworden?


    
Loading...

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang