Java自制WYSIWYG编辑器:按钮样式无法显示格式状态问题
Java WYSIWYG编辑器按钮状态与输入格式同步问题解决
问题根源
你遇到的核心问题是光标位于文本末尾时,无法正确获取后续输入的默认格式属性。使用doc.getCharacterElement(pos)只能获取已有文本的格式,当光标在末尾(无对应字符元素)时,返回的属性并非实际生效的输入格式,导致按钮状态失准。而StyledDocument.getInputAttributes()才是专门存储当前输入位置格式的属性集,不管光标是否在文本末尾,它都能准确反映下一个字符的格式。
修复步骤
1. 替换AttributeSet获取方式
在updateButtonStates函数中,改用getInputAttributes()获取当前输入格式:
private void updateButtonStates() { StyledDocument styledDoc = (StyledDocument) editorPane.getDocument(); AttributeSet inputAttrs = styledDoc.getInputAttributes(); // 更新粗体按钮状态 boldButton.setSelected(StyleConstants.isBold(inputAttrs)); // 更新斜体按钮状态 italicButton.setSelected(StyleConstants.isItalic(inputAttrs)); // 下划线、字体颜色等格式按钮同理 }
2. 处理选中文本的格式一致性
如果存在选中文本,需要判断选中区域内的格式是否统一,再设置按钮状态:
private void updateButtonStates() { JEditorPane editorPane = ...; // 你的编辑器组件 int start = editorPane.getSelectionStart(); int end = editorPane.getSelectionEnd(); StyledDocument styledDoc = (StyledDocument) editorPane.getDocument(); if (start != end) { // 有选中文本:检查选中区域的格式是否统一 boolean isBoldUniform = true; boolean firstBoldState = StyleConstants.isBold(styledDoc.getCharacterElement(start).getAttributes()); for (int i = start + 1; i < end; i++) { if (StyleConstants.isBold(styledDoc.getCharacterElement(i).getAttributes()) != firstBoldState) { isBoldUniform = false; break; } } boldButton.setSelected(isBoldUniform && firstBoldState); // 斜体、下划线等格式按相同逻辑处理 } else { // 无选中:直接用输入属性集 AttributeSet inputAttrs = styledDoc.getInputAttributes(); boldButton.setSelected(StyleConstants.isBold(inputAttrs)); italicButton.setSelected(StyleConstants.isItalic(inputAttrs)); } }
3. 添加监听确保实时更新
给编辑器添加光标移动和文档变更监听,触发按钮状态更新:
// 光标位置变化监听 editorPane.getCaret().addChangeListener(e -> updateButtonStates()); // 文档内容变更监听 styledDoc.addDocumentListener(new DocumentListener() { @Override public void insertUpdate(DocumentEvent e) { updateButtonStates(); } @Override public void removeUpdate(DocumentEvent e) { updateButtonStates(); } @Override public void changedUpdate(DocumentEvent e) { updateButtonStates(); } });
关键说明
getInputAttributes()是StyledDocument维护的「当前输入上下文属性」,任何格式切换操作(如点击粗体按钮)都会自动更新这个集合,能准确反映下一个输入字符的格式。- 选中文本时必须遍历检查格式一致性,避免部分选中时按钮状态误判。
内容的提问来源于stack exchange,提问作者bjk116
相关产品推荐
相关产品推荐

