我用了

doc.setCharacterAttributes(textPane.getSelectionStart(),
           textPane.getSelectionEnd()-textPane.getSelectionStart(),red, false);


更改JTextpane中文本的显示样式。
我尝试使用功能getCharacterAttributes()
查看特定文本的样式,但是DefaultStyledModel没有这种方法。
我该怎么办?

特别优惠:

我知道在vb.net中,一个richtextbox具有一个称为“ rtftext”的属性或其他名称,该属性包含richtextbox中的文本和字体信息。 Java JTextPane中类似的方法/属性是什么?我尝试了getDocument()setDocument,但没有任何反应。

最佳答案

获取属性


您可能可以使用StyledDocument#getCharacterElement(int)Element#getAttributes()

import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.*;

public class CharacterAttributesTest {
  public Component makeUI() {
    StyleContext style = new StyleContext();
    StyledDocument doc = new DefaultStyledDocument(style);
    try {
      doc.insertString(0, "abcdefghijklmnopqrstuvwxyz", null);
    } catch (BadLocationException e) {
      e.printStackTrace();
    }
    MutableAttributeSet attr1 = new SimpleAttributeSet();
    attr1.addAttribute(StyleConstants.Bold, Boolean.TRUE);
    attr1.addAttribute(StyleConstants.Foreground, Color.RED);
    doc.setCharacterAttributes(5, 8, attr1, false);

    MutableAttributeSet attr2 = new SimpleAttributeSet();
    attr2.addAttribute(StyleConstants.Underline, Boolean.TRUE);
    doc.setCharacterAttributes(3, 20, attr2, false);

    JTextPane textPane = new JTextPane(doc);
    textPane.addCaretListener(e -> {
      if (e.getDot() == e.getMark()) {
        AttributeSet a = doc.getCharacterElement(e.getDot()).getAttributes();
        System.out.println("isBold: " + StyleConstants.isBold(a));
        System.out.println("isUnderline: " + StyleConstants.isUnderline(a));
        System.out.println("Font: " + style.getFont(a));
        System.out.println("Foreground: " + StyleConstants.getForeground(a));
      }
    });

    JPanel p = new JPanel(new BorderLayout());
    p.add(new JScrollPane(textPane));
    return p;
  }

  public static void main(String[] args) {
    EventQueue.invokeLater(() -> {
      JFrame f = new JFrame();
      f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
      f.getContentPane().add(new CharacterAttributesTest().makeUI());
      f.setSize(320, 240);
      f.setLocationRelativeTo(null);
      f.setVisible(true);
    });
  }
}

07-26 09:27