javafx中的上标和下标

javafx中的上标和下标,javafx,Javafx,是否有人建议在现有的JavaFXHTML编辑器中添加上标和下标控件。 我正在尝试开发一个公式字段编辑器,其中包含粗体、斜体、上标、下标和字体选择器作为控件。如果没有一些相当严重的黑客攻击,这是不可能的(AFAIK),包括访问API中不打算访问的部分。以下或多或少的作品;我基于HTMLEditorSkin的。您可能需要说服IDE允许您访问相关软件包。这不是特别推荐的,而且几乎可以肯定它在Java9中不起作用 import com.sun.javafx.webkit.Accessor; import

是否有人建议在现有的JavaFXHTML编辑器中添加上标和下标控件。 我正在尝试开发一个公式字段编辑器,其中包含粗体、斜体、上标、下标和字体选择器作为控件。

如果没有一些相当严重的黑客攻击,这是不可能的(AFAIK),包括访问API中不打算访问的部分。以下或多或少的作品;我基于
HTMLEditorSkin
的。您可能需要说服IDE允许您访问相关软件包。这不是特别推荐的,而且几乎可以肯定它在Java9中不起作用

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);
    }
}
import com.sun.javafx.webkit.Accessor;
导入com.sun.webkit.WebPage;
导入javafx.application.application;
导入javafx.application.Platform;
导入javafx.event.event;
导入javafx.event.EventHandler;
导入javafx.scene.scene;
导入javafx.scene.control.ToggleButton;
导入javafx.scene.control.ToggleGroup;
导入javafx.scene.control.ToolBar;
导入javafx.scene.input.KeyEvent;
导入javafx.scene.input.MouseEvent;
导入javafx.scene.web.HTMLEditor;
导入javafx.scene.web.WebView;
导入javafx.stage.stage;
公共类HTMLEditorHack扩展了应用程序{
@凌驾
公共无效开始(阶段primaryStage){
HTMLEditor编辑器=新的HTMLEditor();
场景=新场景(编辑器);
editor.applyCss();
编辑器。布局();
WebView WebView=(WebView)editor.lookup(“.WebView”);
工具栏=(工具栏)编辑器.lookup(“.bottom ToolBar”);
ToggleGroup ToggleGroup=新的ToggleGroup();
createToggleButton(“上标”、“超级”、切换组、网络视图、工具栏);
createToggleButton(“下标”、“子”、切换组、webView、工具栏);
初级阶段。场景(场景);
primaryStage.show();
}
私有void createToggleButton(字符串命令、字符串标签、ToggleGroup ToggleGroup、WebView WebView、工具栏){
ToggleButton=新的ToggleButton(标签);
按钮。setFocusTraversable(假);
button.selectedProperty().addListener((obs、wasSelected、isSelected)->{
WebPage=Accessor.getPageFor(webView.getEngine());
if(page.queryCommandState(command)!=isSelected){
page.executeCommand(命令,null);
}
});
按钮。设置切换组(切换组);
toolbar.getItems().add(按钮);
EventHandler UpdateEstate=e->{
Platform.runLater(()->{
WebPage=Accessor.getPageFor(webView.getEngine());
按钮.setDisable(!page.queryCommandEnabled(命令));
button.setSelected(第页查询命令状态(命令));
});
};
webView.addEventHandler(KeyEvent.ANY,updateState);
webView.addEventHandler(MouseEvent.MOUSE_按下,updateState);
webView.addEventHandler(MouseEvent.MOUSE_发布,updateState);
}
公共静态void main(字符串[]args){
发射(args);
}
}

如果你需要一个健壮的方法来创建一个等式编辑器,我可能会考虑建立你自己的,而不是使用/破解<代码> HTMLeDebug < /C>。有一个第三方库,可用于创建具有不同样式的可编辑文本区域。从那里开始,添加自己的样式控件