Sybuser
Sybuser

Reputation: 1372

How do I apply styles on a JEditorPane?

I know there are libs available such as jsyntaxpane to apply styles on a JEditorPane but here I'm just focusing on applying styles with a minimalist example.

I want to do some syntax coloring on some keywords without using any HTML / CSS.

The content is just plain text.

Initially I just took the example http://www.java2s.com/Code/Java/Swing-JFC/JTextPaneStylesExample2.htm and replaced the JTextPane with a JEditorPane.

try {
    UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
} catch (Exception evt) {}
  
JFrame f = new JFrame("Styles Example 2");

// Create the StyleContext, the document and the pane
StyleContext sc = new StyleContext();
final DefaultStyledDocument doc = new DefaultStyledDocument(sc);
JEditorPane pane = new JEditorPane();
pane.setDocument(doc);
// Create and add the main document style
Style defaultStyle = sc.getStyle(StyleContext.DEFAULT_STYLE);
final Style mainStyle = sc.addStyle("MainStyle", defaultStyle);
StyleConstants.setLeftIndent(mainStyle, 16);
StyleConstants.setRightIndent(mainStyle, 16);
StyleConstants.setFirstLineIndent(mainStyle, 16);
StyleConstants.setFontFamily(mainStyle, "serif");
StyleConstants.setFontSize(mainStyle, 12);

// Create and add the constant width style
final Style cwStyle = sc.addStyle("ConstantWidth", null);
StyleConstants.setFontFamily(cwStyle, "monospaced");
StyleConstants.setForeground(cwStyle, Color.green);

// Create and add the heading style
final Style heading2Style = sc.addStyle("Heading2", null);
StyleConstants.setForeground(heading2Style, Color.red);
StyleConstants.setFontSize(heading2Style, 16);
StyleConstants.setFontFamily(heading2Style, "serif");
StyleConstants.setBold(heading2Style, true);
StyleConstants.setLeftIndent(heading2Style, 8);
StyleConstants.setFirstLineIndent(heading2Style, 0);

try {
  SwingUtilities.invokeAndWait(new Runnable() {
    public void run() {
      try {
        // Set the logical style
        doc.setLogicalStyle(0, mainStyle);

        // Add the text to the document
        doc.insertString(0, text, null);

        // Apply the character attributes
        doc.setCharacterAttributes(49, 13, cwStyle, false);
        doc.setCharacterAttributes(223, 14, cwStyle, false);
        doc.setCharacterAttributes(249, 14, cwStyle, false);
        doc.setCharacterAttributes(286, 8, cwStyle, false);
        doc.setCharacterAttributes(475, 14, cwStyle, false);
        doc.setCharacterAttributes(497, 21, cwStyle, false);
        doc.setCharacterAttributes(557, 9, cwStyle, false);
        doc.setCharacterAttributes(639, 12, cwStyle, false);
        doc.setCharacterAttributes(733, 21, cwStyle, false);
        doc.setCharacterAttributes(759, 9, cwStyle, false);

        // Finally, apply the style to the heading
        doc.setParagraphAttributes(0, 1, heading2Style, false);
      } catch (BadLocationException e) {
      }
    }
  });
} catch (Exception e) {
  System.out.println("Exception when constructing document: " + e);
  System.exit(1);
}

f.getContentPane().add(new JScrollPane(pane));
f.setSize(400, 300);
f.setVisible(true);

No styles were applied and the text is showing with black foreground and white background.

I also have a shorter version inspired by the answer to this question :

Java Swing JEditorPane: manipulating styled documents

JFrame f = new JFrame("Styles Example 2");
StyleContext sc = new StyleContext();
final DefaultStyledDocument doc = new DefaultStyledDocument(sc);
JEditorPane pane = new JEditorPane();
pane.setDocument(doc);
try {
    SwingUtilities.invokeAndWait(new Runnable() {
        public void run() {
            SimpleAttributeSet keyWord = new SimpleAttributeSet();
            StyleConstants.setForeground(keyWord, Color.RED);
            StyleConstants.setBackground(keyWord, Color.YELLOW);
            StyleConstants.setBold(keyWord, true);
            try {
                doc.insertString(doc.getLength(), "\nSome more text", keyWord);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
} catch (Exception e) {
    e.printStackTrace();
}
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().add(new JScrollPane(pane));
f.setSize(400, 300);
f.setVisible(true);

What am I missing here ?

Upvotes: 2

Views: 388

Answers (1)

Sybuser
Sybuser

Reputation: 1372

JEditorPane pane = new JEditorPane("text/rtf","");

From the docs :

  • text/plain Plain text, which is the default the type given isn't recognized. The kit used in this case is an extension of DefaultEditorKit that produces a wrapped plain text view.
  • text/html HTML text. The kit used in this case is the class javax.swing.text.html.HTMLEditorKitwhich provides HTML 3.2 support.
  • text/rtf RTF text. The kit used in this case is the class javax.swing.text.rtf.RTFEditorKitwhich provides a limited support of the Rich Text Format.

Upvotes: 3

Related Questions