javafx - javafx 中的上标和下标

标签 javafx

有人可以建议在现有的 javafx HTML 编辑器中添加上标和下标控件的解决方法。 我正在尝试开发一个具有粗体、斜体、上标、下标和字体选择器作为控件的公式字段编辑器。

最佳答案

如果没有一些非常严重的黑客攻击,这是不可能的 (AFAIK),涉及访问 API 中不打算访问的部分。以下或多或少的作品;我基于 source code对于 HTMLEditorSkin。您可能需要说服您的 IDE 让您访问相关的包。这不是特别推荐的,它几乎肯定不会在 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);
    }
}

如果您需要一种强大的方法来创建方程式编辑器,我可能会考虑构建您自己的,而不是使用/修改 HTMLEditor。有一个第三方库,RichTextFX可用于创建具有不同样式的可编辑文本区域。从那里开始并添加您自己的样式控件。

关于javafx - javafx 中的上标和下标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41729232/

相关文章:

java - 如何摆脱 JavaFX 中的灰色选择边框

JavaFX Node.setOnMouseEntered/Exited 的不稳定行为

javascript - JavaFX WebEngine JavaScript 上行调用

java - fedora 21 javafx 没有创建媒体播放器

JavaFX StackedBarChart - 清除系列在图表中留下不可见的数据

java - 无法在 Android x86_64 上安装 JavaFX 应用程序

java - 如何在 JavaFX 中的 SplitPane Divider 上检测鼠标拖动事件

java - 如何结合散点图和折线图来显示回归线? JavaFX

java - 将 JavaFX 应用程序 (.Jar) 转换为 Windows 应用程序 (.exe)

java - 如何将图像文件加载到ImageView?