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

        fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
 
        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(); 
        attr.addAttribute("strike-color", Color.red); 

        doc.setCharacterAttributes(0, 9, attr, false); 
 
        attr.addAttribute("strike-color", Color.blue); 
        doc.setCharacterAttributes(17, 27, attr, false); 

        JScrollPane sp = new JScrollPane(pane); 
 
        fr.getContentPane().add(sp); 
        fr.setSize(300, 300); 
        fr.setLocationRelativeTo(null); 

        fr.setVisible(true); 
    } 
 
    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) { 
        super(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.setColor(c); 
            g.drawLine(x1, y, x2, y); 
            g.setColor(old); 
        } 
    } 
}