import javafx.application.Application; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.geometry.Side; import javafx.scene.Scene; import javafx.scene.control.Tab; import javafx.scene.control.TabPane; import javafx.scene.control.TextArea; import javafx.scene.web.HTMLEditor; import javafx.stage.Stage; public class CustomHTMLEditor extends Application { private final String HTML = "TEXT"; public CustomHTMLEditor() { } public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) throws Exception { init(primaryStage); primaryStage.show(); } private void init(Stage primaryStage) { final HTMLEditor htmlEditor = new HTMLEditor(); final TabPane tabPane = new TabPane(); primaryStage.setScene(new Scene(tabPane)); tabPane.setSide(Side.BOTTOM); Tab viewTab = new Tab(); viewTab.setClosable(false); viewTab.setText("Renderer"); viewTab.setContent(htmlEditor); tabPane.getTabs().add(0, viewTab); Tab htmlTab = new Tab(); htmlTab.setClosable(false); htmlTab.setText("Editor"); final TextArea textArea = new TextArea(); textArea.onInputMethodTextChangedProperty(); textArea.focusedProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { if (!newValue) { htmlEditor.setHtmlText(textArea.getText()); } } }); htmlEditor.focusedProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { if (!newValue) { textArea.setText(htmlEditor.getHtmlText()); } } }); htmlEditor.setHtmlText(HTML); textArea.setText(HTML); htmlTab.setContent(textArea); tabPane.getTabs().add(1, htmlTab); } }