Geertjan is a DZone Zone Leader and has posted 468 posts at DZone. You can read more from them at their website. View Full User Profile

JavaFX FXML Meets the NetBeans Platform

04.14.2013
| 5006 views |
  • submit to reddit

Here's the FXML that we'd like to see in a NetBeans Platform TopComponent:

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<BorderPane id="topNode" xmlns:fx="http://javafx.com/fxml"
            fx:controller="org.nb.demo.DemoController">    
    <top>
        <HBox fx:id="topHBox" spacing="10">
                <Label fx:id="myLabel1"
                       textFill="#0076a3"            
                       style="-fx-font: Bold 20 papyrus"/>
                <Label fx:id="myLabel2"
                       textFill="#0076a3"
                       wrapText="true"/>
        </HBox>       
        
    </top>
                     
</BorderPane>

Binding will happen on "fx:id" so "myLabel1" and "myLabel2" will be bound to labels named "myLabel1" and "myLabel2". Here's the related controller, in package "org.nb.demo", as specified in the "fx:controller" attribute above:

package org.nb.demo;

import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;

public class DemoController implements Initializable {

    @FXML
    private Label myLabel1;
    @FXML
    private Label myLabel2;

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        myLabel1.setText("hello");
        myLabel2.setText("world");
    }

}

And, finally, here's how to call the above from a TopComponent:

...
...
...
public final class DemoTopComponent extends TopComponent {

    private DemoController controller;
    private JFXPanel fxPanel;

    public DemoTopComponent() {
        initComponents();
        setName(Bundle.CTL_DemoTopComponent());
        setToolTipText(Bundle.HINT_DemoTopComponent());
        setLayout(new BorderLayout());
        init();
    }

    public void init() {
        fxPanel = new JFXPanel();
        add(fxPanel, BorderLayout.CENTER);
        Platform.setImplicitExit(false);
        Platform.runLater(new Runnable() {
            @Override
            public void run() {
                createScene();
            }
        });
    }

    private void createScene() {
        try {
            URL location = getClass().getResource("Demo.fxml");
            FXMLLoader fxmlLoader = new FXMLLoader();
            fxmlLoader.setLocation(location);
            fxmlLoader.setBuilderFactory(new JavaFXBuilderFactory());
            Parent root = (Parent) fxmlLoader.load(location.openStream());
            Scene scene = new Scene(root);
            fxPanel.setScene(scene);
            controller = (DemoController) fxmlLoader.getController();
        } catch (IOException ex) {
            Exceptions.printStackTrace(ex);
        }
    }
...
...
...

Result:

Published at DZone with permission of its author, Geertjan Wielenga.