5

我正在用 Java 开发一个简单的 WYSIWYG RTF 编辑器并且有一个小问题。我需要能够将样式选择切换按钮(例如粗体、斜体、下划线)与用户的文本选择同步。例如,如果当前文本选择是纯文本,则不选择粗体、斜体和带下划线的切换按钮,但是当用户选择一些粗体和带下划线的文本时,会选择粗体和带下划线的切换按钮。

现在我相当确定这JTextPane.getInputAttributes()让我得到了我想要的选择属性,但是在监听插入符号更新事件时存在问题。问题是附加到的插入符号侦听器JTextPane似乎在输入属性更改发生之后被调用。所以选择总是落后一步。也就是说,在更新切换按钮之前,我必须选择文本两次!

这里的重要代码是:

textPane.addCaretListener(new CaretListener() {

        @Override
        public void caretUpdate(CaretEvent e) {
            syncAttributesWithUI(textPane.getInputAttributes());
        }
    });

和:

private void syncAttributesWithUI(AttributeSet attributes) {
    boldButton.setSelected(StyleConstants.isBold(attributes));
    italicButton.setSelected(StyleConstants.isItalic(attributes));
    underlineButton.setSelected(StyleConstants.isUnderline(attributes));
}

提前致谢!

4

2 回答 2

1

CaretListener正在听您的,textPane但选择的现有属性在您的Document. 您可以使用这些CaretEvent方法来查找选定的部分,Document并根据那里找到的样式调整您的按钮。不幸的是,选择可能是不连贯的,例如部分粗体和部分斜体。一种常见的做法是假设用户想要将一组全新的属性应用于整个选择。

于 2010-01-30T20:20:45.280 回答
0

您可以尝试推迟同步,因此其他更改可能首先发生:

@Override
public void caretUpdate(CaretEvent e) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            syncAttributesWithUI(textPane.getInputAttributes());
        }
    });
}

(免责声明:从我的头顶猜测——我实际上并没有写一个测试来确认)

于 2010-02-09T14:55:24.570 回答