gpt4 book ai didi

java - RichTextFX 的撤消功能无法正常工作

转载 作者:太空宇宙 更新时间:2023-11-04 10:17:44 26 4
gpt4 key购买 nike

每当我在 CodeArea 中输入内容并按 CTRL + Z 然后再次开始输入时,光标都会重置到文本的开头。

我调查了这个问题https://github.com/FXMisc/RichTextFX/issues/761似乎这个错误已经修复了。但是,我能够在最新版本(0.9.1)中复制该错误。

以下代码将复制该行为:

public class GuiTest extends Application {

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

@Override
public void start(Stage primaryStage) throws Exception {
StyleClassedTextArea codeArea = new StyleClassedTextArea();
codeArea.replaceText("Text");

VirtualizedScrollPane<StyleClassedTextArea> scrollPane = new VirtualizedScrollPane<>(codeArea);

final Scene scene = new Scene(scrollPane, 600, 400);
primaryStage.setScene(scene);
primaryStage.show();
}
}

我错过了什么吗?如果存在错误,知道如何解决吗?

最佳答案

经过简短的调试后,我发现 RichTextFx 在选择新范围时做了一些奇怪的行为(您就是从这个范围开始输入文本的,光标位置并不重要)。选择新范围时,当前范围设置为 0,0,然后仅移动到光标位置。但是,执行撤消后,新范围将选择为 0,0,而不是当前光标位置。这是因为,当我们按下撤消键时,虽然光标在另一个位置突出显示,但文本却从 0,0 开始输入。

我能够使用反射来解决这个问题。您需要扩展 StyleClassedTextArea,重写 undo() 方法,执行撤消,然后设置需要范围的位置。您可以将范围设置为当前光标位置,但光标并不总是位于正确的位置,尤其是当光标需要移动到另一个段落中的另一个样式时。我在 undoManager 的 ChangeQueue 中得到了正确的位置范围。

您需要确保正确转换,因此在转换之前进行一些调试。

@Override
public void undo() {
if (isUndoAvailable()) {
super.undo();
UndoManager undoManager = getUndoManager();
try {
Field queueField = UndoManagerImpl.class.getDeclaredField("queue");
queueField.setAccessible(true);
UnlimitedChangeQueue queue = (UnlimitedChangeQueue) queueField
.get(undoManager);
int newRange = ((PlainTextChange) ((List) queue.peekNext()).get(0))
.getRemovalEnd();
selectRange(newRange, newRange);
} catch (NoSuchFieldException | IllegalAccessException e) {
// Handle exception
}
}
}

@Override
public void redo() {
if (isRedoAvailable()) {
super.redo();
UndoManager undoManager = getUndoManager();
try {
Field queueField = UndoManagerImpl.class.getDeclaredField("queue");
queueField.setAccessible(true);
UnlimitedChangeQueue queue = (UnlimitedChangeQueue) queueField
.get(undoManager);
int newRange = ((PlainTextChange) ((List) queue.peekPrev()).get(0))
.getInsertionEnd();
selectRange(newRange, newRange);
} catch (NoSuchFieldException | IllegalAccessException e) {
// Handle
}
}
}

关于java - RichTextFX 的撤消功能无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51485691/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com