2

我正在研究在 JavaFX 中编写富文本编辑器的最佳方法 - 不要向我提及 HTMLEditor:我们已经花了几个月的时间来破解它,我可以写很多关于为什么它不适合我们的目的!目前的选择是扩展 AnchorPane 并从头开始执行所有布局、导航等,或者扩展 TextInputArea,这看起来会有所帮助。任何人都有自己的实现或想提出一个最小的实现?

FWIW这是我的一个片段:

公共类 TryPain3 扩展 TextInputControl { private AnchorPane rootNode = new AnchorPane();

public TryPain3() {
    super(new Content() {
        private String text = "";

        @Override
        public String get(int i, int i1) {
            return text.substring(i, i1);
        }

        @Override
        public void insert(int i, String string, boolean bln) {
        }

        @Override
        public void delete(int i, int i1, boolean bln) {
        }

        @Override
        public int length() {
            return text.length();
        }

        @Override
        public String get() {
            return text;
        }

        @Override
        public void addListener(ChangeListener<? super String> cl) {

        }

        @Override
        public void removeListener(ChangeListener<? super String> cl) {
            throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
        }

        @Override
        public String getValue() {
            return text;
        }

        @Override
        public void addListener(InvalidationListener il) {

        }

        @Override
        public void removeListener(InvalidationListener il) {
            throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
        }
    });

    setEditable(true);

    Text text1 = new Text("fred was here");
    text1.setFont(Font.font("Tahoma", FontWeight.NORMAL, 18));
    text1.setTextAlignment(TextAlignment.LEFT);

    text1.setFontSmoothingType(FontSmoothingType.LCD);

    rootNode.getChildren().add(text1);


    setSkin(new TP3Skin(this, rootNode));

}


class TP3Skin implements Skin<TryPain3> {
    TryPain3 tp;
    Node root;

    public TP3Skin(TryPain3 tp, Node root) {
        this.tp = tp;
        this.root = root;
    }


    @Override
    public TryPain3 getSkinnable() {
        return tp;
    }

    @Override
    public Node getNode() {
        return root;
    }

    @Override
    public void dispose() {
        tp = null;
        rootNode = null;
    }

}

}

看起来好像皮肤不是可选的。

我想知道的问题是:

  • UI 应该如何绘制 - 我很乐意从头开始编写代码,但如何从调用 forward() 中获益作为示例
  • UI 创建应该在皮肤中完成吗?
  • 如果单击一些文本,基类是否处理诸如将光标放在哪里的事情

我相信其他问题会由此产生。

4

1 回答 1

1

您可能想尝试下一个 JavaFX 8.0 控件TextFlow,它允许聚合各种文本样式。在此处查看示例:https ://wikis.oracle.com/display/OpenJDK/Rich+Text+API+Samples

JavaFX 8 是 JDK8 的一部分。所以你可以在这里下载开发人员构建http://jdk8.java.net/download.html,它将包括 JavaFX 和新的 TextFlow 控件。

于 2012-12-13T20:30:31.627 回答