2017-01-18 5 views
2

Kann jemand eine Umgehungslösung vorschlagen, um im vorhandenen HTML-Editor von javafx Hoch- und Tiefgestellt-Steuerelemente hinzuzufügen. Ich versuche, einen Formel-Feld-Editor mit Fett, Kursiv, Hochgestellt, Tiefgestellt und Schriftart-Selektor als Steuerelemente zu entwickeln.Hochgestellt und tiefgestellt in javafx

Antwort

2

Dies ist nicht möglich (AFAIK) ohne einige ziemlich schwere Hacking, Zugriff auf Teile der API, die nicht zugegriffen werden sollen. Das Folgende funktioniert mehr oder weniger; Ich habe es auf der source code für die HTMLEditorSkin basiert. Möglicherweise müssen Sie Ihre IDE davon überzeugen, dass Sie auf die entsprechenden Pakete zugreifen können. Dies ist nicht besonders zu empfehlen, und es wird mit ziemlicher Sicherheit nicht funktioniert in Java 9.

import com.sun.javafx.webkit.Accessor; 
import com.sun.webkit.WebPage; 

import javafx.application.Application; 
import javafx.application.Platform; 
import javafx.event.Event; 
import javafx.event.EventHandler; 
import javafx.scene.Scene; 
import javafx.scene.control.ToggleButton; 
import javafx.scene.control.ToggleGroup; 
import javafx.scene.control.ToolBar; 
import javafx.scene.input.KeyEvent; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.web.HTMLEditor; 
import javafx.scene.web.WebView; 
import javafx.stage.Stage; 

public class HTMLEditorHack extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     HTMLEditor editor = new HTMLEditor(); 
     Scene scene = new Scene(editor); 
     editor.applyCss(); 
     editor.layout(); 

     WebView webView = (WebView) editor.lookup(".web-view"); 
     ToolBar toolbar = (ToolBar) editor.lookup(".bottom-toolbar"); 
     ToggleGroup toggleGroup = new ToggleGroup(); 

     createToggleButton("superscript", "Super", toggleGroup, webView, toolbar); 
     createToggleButton("subscript", "Sub", toggleGroup, webView, toolbar); 

     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    private void createToggleButton(String command, String label, ToggleGroup toggleGroup, WebView webView, ToolBar toolbar) { 
     ToggleButton button = new ToggleButton(label); 
     button.setFocusTraversable(false); 
     button.selectedProperty().addListener((obs, wasSelected, isSelected) -> { 
      WebPage page = Accessor.getPageFor(webView.getEngine()); 
      if (page.queryCommandState(command) != isSelected) { 
       page.executeCommand(command, null); 
      } 
     }); 
     button.setToggleGroup(toggleGroup); 
     toolbar.getItems().add(button); 

     EventHandler<Event> updateState = e -> { 
      Platform.runLater(() -> { 
       WebPage page = Accessor.getPageFor(webView.getEngine()); 
       button.setDisable(! page.queryCommandEnabled(command)); 
       button.setSelected(page.queryCommandState(command)); 
      }); 
     }; 
     webView.addEventHandler(KeyEvent.ANY, updateState); 
     webView.addEventHandler(MouseEvent.MOUSE_PRESSED, updateState); 
     webView.addEventHandler(MouseEvent.MOUSE_RELEASED, updateState); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 

Wenn Sie ein Formel-Editor zum Erstellen, einen robusteren Ansatz brauchen würde ich wahrscheinlich Ihre eigene betrachten Aufbau, anstelle der Verwendung/Hacking HTMLEditor . Es gibt eine dritte Bibliothek, RichTextFX, die verwendet werden kann, um einen bearbeitbaren Textbereich mit verschiedenen Stilen zu erstellen. Beginne dort und füge deine eigenen Steuerelemente für das Styling hinzu.

Verwandte Themen