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