【问题标题】:JTextPane Synchronize Style Selection UI ProblemJTextPane 同步样式选择 UI 问题
【发布时间】:2010-01-30 17:14:53
【问题描述】:

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

提前致谢!

【问题讨论】:

  • 您的问题得到解答了吗?如果没有,请考虑发布 SSCCE

标签: java swing user-interface jtextpane


【解决方案1】:

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

【讨论】:

  • 你建议的方法其实是我原来在做的。我会得到选择的每个单独的字符元素,并找到属性集的交集来确定 UI 应该反映什么。但后来我意识到 1) getInputAttributes() 方法似乎已经这样做了,并且 2) 如果插入符号被移动到文档中的最后一个位置,直到用户触发输入,我的方法无法确定正在应用的样式。当然,我可以通过计算(结束位置 - 1)处的字符样式来确定这一点,但我希望有一种更清洁的方式:(
  • 我希望用户希望getInputAttributes() 返回的属性在插入符号位于末尾时保持不变。
【解决方案2】:

您可以尝试推迟同步,以便先进行其他更改:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-16
    • 2020-08-10
    • 2019-11-20
    • 1970-01-01
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多