JTextPane formatting [closed]

偶尔善良 提交于 2019-11-26 06:49:14

问题


I have a JTextPane where I want to add lines and depending on their content have them have a different formatting.

Currently I have this

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
}

I took out the catch statements to reduce code size.

However, this formats my entire text with the styleNorm. Is this because it\'s the last called Style and they overwrite eachother? If so, how do I fix this?


回答1:


Also seen here, TextComponentDemo shows how to apply a number of StyleConstants, including font size, style, alignment and color. The styles may applied either directly to the Document, as shown in initAttributes(), or via the actions of StyledEditorKit, seen here.

Addendum: The example below creates three related styles using SimpleAttributeSet. Note that highAlert alters the color but retains the bold attribute inherited from boldBlue.

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);
                }
            }
        });
    }
}


来源:https://stackoverflow.com/questions/15600100/jtextpane-formatting

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!