Articles Projects Tips Downloads Contacts About

Colored Strikethrough text attribute with user defined color in JEditorPane.

To implement coloring of strikethrough attribute we define a custom attribute with name "strike-color" in the StyledEditorKit extension. The attributes value is necessary Color. The LabelView extension check the attribute and renders strikethrough line with the color if specified.

The source code is below:

import javax.swing.*; 

import javax.swing.text.*; 
import java.awt.*; 
public class ColoredStrikeThroughText { 
    public ColoredStrikeThroughText() { 
        JFrame fr = new JFrame("Custom color StrikeThrough attribute"); 

        JEditorPane pane = new JEditorPane(); 
        pane.setEditorKit(new StyledEditorKit() { 
            public ViewFactory getViewFactory() { 
                return new NewViewFactory(); 

        pane.setText("Color red text, color blue text, text without coloring."); 
        StyledDocument doc = (StyledDocument) pane.getDocument(); 
        MutableAttributeSet attr = new SimpleAttributeSet(); 

        doc.setCharacterAttributes(0, 9, attr, false); 
        doc.setCharacterAttributes(17, 27, attr, false); 

        JScrollPane sp = new JScrollPane(pane); 
        fr.setSize(300, 300); 

    public static void main(String[] args) { 
        ColoredStrikeThroughText test = new ColoredStrikeThroughText(); 

class NewViewFactory implements ViewFactory { 
    public View create(Element elem) { 
        String kind = elem.getName(); 
        if (kind != null) { 
            if (kind.equals(AbstractDocument.ContentElementName)) { 

                return new MyLabelView(elem); 
            else if (kind.equals(AbstractDocument.ParagraphElementName)) { 
                return new ParagraphView(elem); 
            else if (kind.equals(AbstractDocument.SectionElementName)) { 
                return new BoxView(elem, View.Y_AXIS); 

            else if (kind.equals(StyleConstants.ComponentElementName)) { 
                return new ComponentView(elem); 
            else if (kind.equals(StyleConstants.IconElementName)) { 
                return new IconView(elem); 

        // default to text display 
        return new LabelView(elem); 
class MyLabelView extends LabelView { 

    public MyLabelView(Element elem) { 
    public void paint(Graphics g, Shape allocation) { 
        super.paint(g, allocation); 
        paintStrikeLine(g, allocation); 

    public void paintStrikeLine(Graphics g, Shape a) { 
        Color c=(Color)getElement().getAttributes().getAttribute("strike-color"); 
        if (c!=null) { 
            int y = a.getBounds().y + a.getBounds().height - (int) getGlyphPainter().getDescent(this); 

            y = y - (int) (getGlyphPainter().getAscent(this) * 0.3f); 
            int x1 = (int) a.getBounds().getX(); 
            int x2 = (int) (a.getBounds().getX() + a.getBounds().getWidth()); 

            Color old = g.getColor(); 
            g.drawLine(x1, y, x2, y);