我正在研究在 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 创建应该在皮肤中完成吗?
- 如果单击一些文本,基类是否处理诸如将光标放在哪里的事情
我相信其他问题会由此产生。