2

テキストの色がデフォルトで青に設定されている JTextPane があります。テキストに取り消し線を追加すると、取り消し線の色はテキストと同じ (青) になります。文字と取り消し線の色を変えたい。たとえば、テキストの色が青の場合、取り消し線は異なる必要があります。

アイデアをください。

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

3 に答える 3

2
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);
        }
    }
}
于 2011-03-17T11:18:40.500 に答える
1

私はこれがトリックを行うべきだと思う...

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);
于 2011-03-17T10:09:10.347 に答える
0

または、StyledLabels を見ることもできます。

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

15ページで...

于 2011-03-17T10:33:25.953 に答える