Bibhaw
Bibhaw

Reputation: 497

Swing : font color & strike color in JTextPane

I have a JTextPane in which text color is set as blue by default. Now i added strike-through on text then strike-through color becomes as same of text (blue). I want the color of text and strike-through different. e.g. if text color is blue then the strike-through must be different.

Please give me some idea.

    JTextPane text = new JTextPane();

    Font font = new Font("Serif", Font.ITALIC, 20);
    text.setFont(font); 

    text.setForeground(Color.BLUE); 

    Style style = text.addStyle("Bold", null);
    StyleConstants.setStrikeThrough(style, true);

    text.setCharacterAttributes(style, false);

Upvotes: 2

Views: 2726

Answers (3)

StanislavL
StanislavL

Reputation: 57381

import java.awt.*;
import javax.swing.*;
import javax.swing.text.*;

public class Test {

    public Test() {
        JFrame fr = new JFrame("TEST");
        fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JEditorPane pane = new JEditorPane();
        pane.setEditorKit(new NewEditorKit());
        pane.setText("test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test ");

        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(10, 19, 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) {
        Test test = new Test();
    }
}

class NewEditorKit extends StyledEditorKit {
    public ViewFactory getViewFactory() {
        return new NewViewFactory();
    }
}

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

Upvotes: 2

Velter
Velter

Reputation: 2160

Or you could have a look at StyledLabels:

http://www.jidesoft.com/products/JIDE_Common_Layer_Developer_Guide.pdf

At page 15...

Upvotes: 0

Velter
Velter

Reputation: 2160

I think this should do the trick...

MutableAttributeSet attributes = text.getInputAttributes();
StyleConstants.setStrikeThrough(attributes , true);
StyleConstants.setForeground(attributes , Color.BLack);

StyledDocument doc = text.getStyledDocument();
doc.setCharacterAttributes(0, doc.getLength() + 1, attributes, false);

Upvotes: 1

Related Questions