JTextPane格式化
我有一个JTextPane,我想添加行,根据他们的内容,他们有不同的格式。
目前我有这个
StyleContext context = new StyleContext(); StyledDocument document = new DefaultStyledDocument(context); Style styleBold = context.getStyle(StyleContext.DEFAULT_STYLE); StyleConstants.setBold(styleBold, true); StyleConstants.setFontSize(styleBold, 18); Style styleNorm = context.getStyle(StyleContext.DEFAULT_STYLE); StyleConstants.setFontSize(styleNorm, 15); for (int i = 0; i < temp.size(); i++) { String tmp = temp.get(i); if (tmp.substring(0, 2).equals(COMMENT_PREFIX)) { String addThis = " - " + tmp.substring(2); try { document.insertString(document.getLength(), addThis, styleNorm); } //CATCH } else if (tmp.substring(0, 2).equals(VERSION_PREFIX)) { Date d = new Date(System.currentTimeMillis()); String addThis = "Version: " + tmp.substring(2) + " - " + d.toString(); try { document.insertString(document.getLength(), addThis, styleBold); } //CATCH } try { document.insertString(document.getLength(), "\n", styleNorm); } //CATCH }
我拿出了catch语句来减少代码大小。
但是,这会使用styleNorm
格式化我的整个文本。 这是因为它是最后一个名为Style
并且它们会相互覆盖吗? 如果是这样,我该如何解决这个问题?
此处还可以看到, TextComponentDemo
显示了如何应用多个StyleConstants
,包括字体大小,样式,对齐方式和颜色。 样式可以直接应用于Document
,如initAttributes()
所示,也可以通过StyledEditorKit
的操作应用, StyledEditorKit
所示。
附录:下面的示例使用SimpleAttributeSet
创建三个相关样式。 请注意, highAlert
会更改颜色,但会保留从boldBlue
inheritance的粗体属性。
import java.awt.Color; import java.awt.EventQueue; import java.util.Date; import javax.swing.JFrame; import javax.swing.JTextPane; import javax.swing.text.BadLocationException; import javax.swing.text.SimpleAttributeSet; import javax.swing.text.StyleConstants; import javax.swing.text.StyledDocument; /** * @see https://stackoverflow.com/a/15600689/230513 */ public class Test { private void display() throws BadLocationException { JFrame f = new JFrame("Test"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); String s = new Date().toString(); JTextPane jtp = new JTextPane(); StyledDocument doc = (StyledDocument) jtp.getDocument(); SimpleAttributeSet normal = new SimpleAttributeSet(); StyleConstants.setFontFamily(normal, "SansSerif"); StyleConstants.setFontSize(normal, 16); SimpleAttributeSet boldBlue = new SimpleAttributeSet(normal); StyleConstants.setBold(boldBlue, true); StyleConstants.setForeground(boldBlue, Color.blue); SimpleAttributeSet highAlert = new SimpleAttributeSet(boldBlue); StyleConstants.setFontSize(highAlert, 18); StyleConstants.setItalic(highAlert, true); StyleConstants.setForeground(highAlert, Color.red); doc.insertString(doc.getLength(), s + "\n", normal); doc.insertString(doc.getLength(), s + "\n", boldBlue); doc.insertString(doc.getLength(), s + "\n", highAlert); f.add(jtp); f.pack(); f.setLocationRelativeTo(null); f.setVisible(true); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { new Test().display(); } catch (BadLocationException ex) { ex.printStackTrace(System.err); } } }); } }