5

JTextPane でテキストに色を付けようとしていますが、問題はテキストと下線に異なる色を付けることはできません。どうすればそれを行うべきですか、それとも可能ですか? 以下の例では、すべてのテキストと下線を赤で印刷します。

JTextPane pane = new JTextPane();

StyleContext context = new StyleContext();

Style style = pane.addStyle("Black", null);
StyleConstants.setAlignment(style, StyleConstants.ALIGN_RIGHT);
StyleConstants.setFontSize(style, 14);
StyleConstants.setSpaceAbove(style, 4);
StyleConstants.setSpaceBelow(style, 4);
StyleConstants.setForeground(style, Color.BLACK);

StyledDocument document = pane.getStyledDocument();


style = pane.addStyle("Red Underline", style);
StyleConstants.setForeground(style, Color.RED);
StyleConstants.setUnderline(style, true);

pane.getDocument().insertString(0,  "Test String", style);
4

3 に答える 3

5

これが私が見つけた解決策です...

AttributeSet で StyleConstant に別の色で下線を引く

サンプルコードへのリンクはこちら

http://java-sl.com/tip_colored_strikethrough.html

次の行を変更するだけで解決します...

int y = a.getBounds().y + a.getBounds().height + 2 ; 

そしてそれはうまくいきます

于 2012-08-22T12:05:11.110 に答える
4

基本的に、作成する必要のある3つのクラスがあります。

  • 必要に応じてビューを変更するには、 javax.swing.text.LabelViewを拡張する必要があります(色付きの下線を追加するかどうかは関係ありません)。メソッドをオーバーライドしますpaint(Graphics, Shape)。オーバーライドされたクラスのこの行を使用して属性にアクセスできます。属性は、テキストに何かを追加する(下線を追加するなど)ためのトリガーである必要があります。

    getElement().getAttributes().getAttribute("attribute name");

  • 新しいViewFactorycreateを作成し、メソッドを上書きする必要があります。これを行うときは、すべての要素タイプを処理することが重要です(そうしないと、正しく表示されません。

  • どちらを使用するかをペインに指示するには、 StyledEditorKitを作成する必要がありViewFactoryます。

これの単純化された実行可能な例を次に示します。

import java.awt.*;
import javax.swing.*;
import javax.swing.plaf.basic.BasicTextPaneUI;
import javax.swing.text.*;

public class TempProject extends JPanel{


    public static void main(String args[])    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

                //Adding pane
                JTextPane pane = new JTextPane();
                pane.setEditorKit(new CustomEditorKit());
                pane.setText("Underline With Different Color");

                //Set Style
                StyledDocument doc = (StyledDocument)pane.getDocument();
                MutableAttributeSet attrs = new SimpleAttributeSet();
                attrs.addAttribute("Underline-Color", Color.red);
                doc.setCharacterAttributes(0, doc.getLength()-1, attrs, true);

                JScrollPane sp = new JScrollPane(pane);
                frame.setContentPane(sp);  
                frame.setPreferredSize(new Dimension(400, 300));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);


            }
        });
    }

    public static class CustomEditorKit extends StyledEditorKit{

        public ViewFactory getViewFactory(){
            return new CustomUI();
        }
    }

    public static class CustomUI extends BasicTextPaneUI{
        @Override
        public View create(Element elem){
            View result = null;
            String kind = elem.getName();
            if(kind != null){
                if(kind.equals(AbstractDocument.ContentElementName)){
                    result = new MyLabelView(elem);
                } else if(kind.equals(AbstractDocument.ParagraphElementName)){
                    result = new ParagraphView(elem);
                }else if(kind.equals(AbstractDocument.SectionElementName)){
                    result = new BoxView(elem, View.Y_AXIS);
                }else if(kind.equals(StyleConstants.ComponentElementName)){
                    result = new ComponentView(elem);
                }else if(kind.equals(StyleConstants.IconElementName)){
                    result = new IconView(elem);
                } else{
                    result = new LabelView(elem);
                }
            }else{
                result = super.create(elem);
            }

            return result;
        }
    }

    public static class MyLabelView extends LabelView{

        public MyLabelView(Element arg0) {
            super(arg0);
        }

        public void paint(Graphics g, Shape a){
            super.paint(g, a);
            //Do whatever other painting here;
            Color c = (Color)getElement().getAttributes().getAttribute("Underline-Color");
            if(c != null){
                int y = a.getBounds().y + (int)getGlyphPainter().getAscent(this);
                int x1 = a.getBounds().x;
                int x2 = a.getBounds().width + x1;

                g.setColor(c);
                g.drawLine(x1, y, x2, y);
            }

        }

    }

}

別のサンプルコードへのリンクは次のとおりです。

http://java-sl.com/tip_colored_strikethrough.html

この答えは主に後世のためのものです。リンクされたコードと説明の簡略化されたバージョンを追加すると、物事がより理解しやすくなると思いました。

于 2012-08-22T16:56:01.097 に答える
2
  • たとえば、およびHtmlの場合

  • Documentモデルをビューに返します。行が開始/終了したインデックスを特定できます

于 2012-08-22T12:03:01.673 に答える