2011-01-12 9 views
9

私のJTextPaneの1行から次の行に灰色と白を交互に背景として使用したいと思います。 私はpaintComponent()メソッドをオーバーロードし、コンポーネントの高さに応じて背景を手動で描画することでフォントサイズを試みましたが、成功しませんでした。JTextPaneの行にカスタム背景色を設定するには

ヒント

+0

「1行」とはどういう意味ですか?使用している色を交互に使用すると、setBackground()は機能しませんか? – jzd

+0

は編集可能なテキストパネルですか?つまり、行が追加/削除された場合に背景を変更したいのですか? – dogbane

答えて

2

this questionに応答して、@ VonCによって書かれたラインハイライター(またはhere)を使用できます。次のようにあなたがそれを使用することができます別のライン強調するために

:ここ

public static void main(String[] args) { 

    JTextPane t = new JTextPane(); 
    t.setSelectionColor(new Color(1.0f, 1.0f, 1.0f, 0.0f)); 
    Highlighter hilite = new MyHighlighter(); 
    t.setHighlighter(hilite); 
    t.setText("Line1\nLine2\nLine3\nLine4\nLine5\n"); 


    DefaultHighlightPainter whitePainter = new DefaultHighlighter.DefaultHighlightPainter(Color.WHITE); 
    DefaultHighlightPainter grayPainter = new DefaultHighlighter.DefaultHighlightPainter(Color.GRAY); 

    try { 
     Document doc = t.getDocument(); 
     String text = doc.getText(0, doc.getLength()); 
     int start = 0; 
     int end = 0 ; 

     boolean even = true; 

     //look for newline char, and then toggle between white and gray painters. 
     while ((end = text.indexOf('\n', start)) >= 0) { 
      even = !even; 
      DefaultHighlightPainter painter = even ? grayPainter : whitePainter; 
      hilite.addHighlight(start, end+1, painter); 
      start = end+1; 
     } 
    } catch (BadLocationException e) { 
     e.printStackTrace(); 
    } 

    JPanel p = new JPanel(new BorderLayout());  
    p.add(t, BorderLayout.CENTER); 
    JFrame f = new JFrame(); 
    f.add(p); 
    f.setSize(100, 100); 
    f.setVisible(true); 
} 

がVonCのMyHighlighterです:

class MyHighlighter extends DefaultHighlighter 
{ 

    private JTextComponent component; 

    /** 
    * @see javax.swing.text.DefaultHighlighter#install(javax.swing.text.JTextComponent) 
    */ 
    @Override 
    public final void install(final JTextComponent c) 
    { 
     super.install(c); 
     this.component = c; 
    } 

    /** 
    * @see javax.swing.text.DefaultHighlighter#deinstall(javax.swing.text.JTextComponent) 
    */ 
    @Override 
    public final void deinstall(final JTextComponent c) 
    { 
     super.deinstall(c); 
     this.component = null; 
    } 

    /** 
    * Same algo, except width is not modified with the insets. 
    * 
    * @see javax.swing.text.DefaultHighlighter#paint(java.awt.Graphics) 
    */ 
    @Override 
    public final void paint(final Graphics g) 
    { 
     final Highlighter.Highlight[] highlights = getHighlights(); 
     final int len = highlights.length; 
     for (int i = 0; i < len; i++) 
     { 
      Highlighter.Highlight info = highlights[i]; 
      if (info.getClass().getName().indexOf("LayeredHighlightInfo") > -1) 
      { 
       // Avoid allocing unless we need it. 
       final Rectangle a = this.component.getBounds(); 
       final Insets insets = this.component.getInsets(); 
       a.x = insets.left; 
       a.y = insets.top; 
       // a.width -= insets.left + insets.right + 100; 
       a.height -= insets.top + insets.bottom; 
       for (; i < len; i++) 
       { 
        info = highlights[i]; 
        if (info.getClass().getName().indexOf(
          "LayeredHighlightInfo") > -1) 
        { 
         final Highlighter.HighlightPainter p = info 
           .getPainter(); 
         p.paint(g, info.getStartOffset(), info 
           .getEndOffset(), a, this.component); 
        } 
       } 
      } 
     } 
    } 
} 
0
JTextField someField = new JTextField(); 
someField.setBackground(Color.GREY); 
+0

Sory私はJTextFieldではなくJTextPaneを意味しました...私は質問を修正しました。 – jumar

+0

残念ながら、これは** line **の1行だけでなく、** whole ** JTextPaneの色を変更します。 – Riduidel

+0

@リダイデル、そうです、しかし、この質問はもともと、この言葉で書かれたやり方は意味がありました。 – jzd

1

ここには可能な解決策のan exampleがあります。

少し説明すると、JTextPaneはスタイル付きのドキュメントエディタであり、そのようにして、StyledDocumentを変更することができます。つまり、ある行の背景色のようなスタイル情報を含むドキュメントです。

0

paintComponent()メソッドをオーバーロードし、コンポーネントの高さに応じて背景を手動で描画しようとしましたが、フォントサイズは成功しませんでした。

合理的に聞こえます。テキストペインを非不透明にしてください。

次に、基本的なコードは次のようになります。

  1. クリップ領域に基づいて、交流の背景を描く
  2. は(super.paintComponentを呼び出す)ので、テキストが背景の上に描かれています。

さらに詳しい情報が必要な場合は、SSCCEを投稿してください。

-1

JTextPaneのは、テキストとしてHTMLドキュメントがかかります。 HTML文書を使ってJTextPaneにテキストを追加することを検討しましたか?

JTextPane pane = new JTextPane(); 
pane.setContentType("text/html"); 

String text = /*some html table or set of divs for formatting */ 

pane.setText(text); 

myJFrame.add(pane); 

テキスト文字列を作成するときに、cssを使用して交互に色を設定したり、作成したドキュメントに直接ハードコードすることができます。これにより、再描画メソッドをオーバーライドする必要がなくなります。

これは、ユーザーがボックスを編集することを許可しない場合に有効です(つまり、setEditableをfalseに設定します)。ユーザーがEnterキーを押すたびに行を再描画すると思われる場合は、ソリューション

関連する問題