JTextPane同步样式选择UI问题

时间:2010-01-30 17:14:53

标签: java swing user-interface jtextpane

我正在用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));
}

提前致谢!

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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

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