Java tutorial
/** * * @author Kishori Sharan (www.jdojo.com) * @version 1.0 * * <b>@copyright</b> You can use, modify, copy-paste the code for any purpose, in any way you see fit. No restrictions apply. */ import javafx.application.Application; import javafx.application.Platform; import javafx.beans.value.ObservableValue; import javafx.geometry.VPos; import javafx.scene.Node; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.TextField; import javafx.scene.layout.GridPane; import javafx.scene.paint.Color; import javafx.scene.text.Font; import javafx.scene.text.Text; import javafx.stage.Stage; public class Main extends Application { // An instance variable to store the Text node reference private Text helpText = new Text(); public static void main(String[] args) { Application.launch(args); } @Override public void start(Stage stage) { TextField fName = new TextField(); TextField lName = new TextField(); TextField salary = new TextField(); Button closeBtn = new Button("Close"); closeBtn.setOnAction(e -> Platform.exit()); fName.getProperties().put("microHelpText", "Enter the first name"); lName.getProperties().put("microHelpText", "Enter the last name"); salary.getProperties().put("microHelpText", "Enter a salary greater than $2000.00."); // The help text node is unmanaged helpText.setManaged(false); helpText.setTextOrigin(VPos.TOP); helpText.setFill(Color.RED); helpText.setFont(Font.font(null, 9)); helpText.setMouseTransparent(true); // Add all nodes to a GridPane GridPane root = new GridPane(); root.add(new Label("First Name:"), 1, 1); root.add(fName, 2, 1); root.add(new Label("Last Name:"), 1, 2); root.add(lName, 2, 2); root.add(new Label("Salary:"), 1, 3); root.add(salary, 2, 3); root.add(closeBtn, 3, 3); root.add(helpText, 4, 3); Scene scene = new Scene(root, 300, 100); // Add a change listener to the scene, so we know when // the focus owner changes and display the micro help scene.focusOwnerProperty().addListener((ObservableValue<? extends Node> value, Node oldNode, Node newNode) -> focusChanged(value, oldNode, newNode)); stage.setScene(scene); stage.setTitle("Showing Micro Help"); stage.show(); } public void focusChanged(ObservableValue<? extends Node> value, Node oldNode, Node newNode) { // Focus has changed to a new node String microHelpText = (String) newNode.getProperties().get("microHelpText"); if (microHelpText != null && microHelpText.trim().length() > 0) { helpText.setText(microHelpText); helpText.setVisible(true); // Position the help text node double x = newNode.getLayoutX() + newNode.getLayoutBounds().getMinX() - helpText.getLayoutBounds().getMinX(); double y = newNode.getLayoutY() + newNode.getLayoutBounds().getMinY() + newNode.getLayoutBounds().getHeight() - helpText.getLayoutBounds().getMinX(); helpText.setLayoutX(x); helpText.setLayoutY(y); helpText.setWrappingWidth(newNode.getLayoutBounds().getWidth()); } else { helpText.setVisible(false); } } }