2012-03-10 18 views
25

私はこれを行う方法を知っておく必要があります。JtextAreaでテキストの色を変更するには?

さんが言ってみましょう:私はこのようなJTextAreaにのコードを持って、

のLOAD R1、1 12月R1 STORE M、R1 ADD R4、R1、 8

私はLOADの色を変更したい、12月、STOREとtを変更する方法ORANGE

にRED 番号に緑 Mを着色するBLUE R1、R4を着色するADD彼はこのテキストの色ですか? これらのテキストはメモ帳からのものでも、textAreaに直接入力することもできます。

ありがとうございます。

+1

ベストおそらくJTextAreaのを使用する代わりに、JEditorPaneのまたは類似を使用していません。 –

+1

正しく使用する[Styled TextをサポートするJTextComponent](http://docs.oracle.com/javase/tutorial/uiswing/components/editorpane.html)、JTextAreaは正しい方法ではありません... – mKorbel

答えて

70

JTextAreaPlain Textを楽しませることを意味しています。 1文字に適用される設定は、JTextAreaの文書全体に適用されます。しかし、JTextPaneまたはJEditorPaneであなたの好みに合わせてString Literalsの色を付けることができます。ここJTextPaneの助けを借りて、あなたはこのようにそれを行うことができます。

import java.awt.*; 

import java.awt.event.*; 

import javax.swing.*; 

import javax.swing.border.*; 

import javax.swing.text.AttributeSet; 
import javax.swing.text.SimpleAttributeSet; 
import javax.swing.text.StyleConstants; 
import javax.swing.text.StyleContext; 

public class TextPaneTest extends JFrame 
{ 
    private JPanel topPanel; 
    private JTextPane tPane; 

    public TextPaneTest() 
    { 
     topPanel = new JPanel();   

     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLocationRelativeTo(null);    

     EmptyBorder eb = new EmptyBorder(new Insets(10, 10, 10, 10)); 

     tPane = new JTextPane();     
     tPane.setBorder(eb); 
     //tPane.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY)); 
     tPane.setMargin(new Insets(5, 5, 5, 5)); 

     topPanel.add(tPane); 

     appendToPane(tPane, "My Name is Too Good.\n", Color.RED); 
     appendToPane(tPane, "I wish I could be ONE of THE BEST on ", Color.BLUE); 
     appendToPane(tPane, "Stack", Color.DARK_GRAY); 
     appendToPane(tPane, "Over", Color.MAGENTA); 
     appendToPane(tPane, "flow", Color.ORANGE); 

     getContentPane().add(topPanel); 

     pack(); 
     setVisible(true); 
    } 

    private void appendToPane(JTextPane tp, String msg, Color c) 
    { 
     StyleContext sc = StyleContext.getDefaultStyleContext(); 
     AttributeSet aset = sc.addAttribute(SimpleAttributeSet.EMPTY, StyleConstants.Foreground, c); 

     aset = sc.addAttribute(aset, StyleConstants.FontFamily, "Lucida Console"); 
     aset = sc.addAttribute(aset, StyleConstants.Alignment, StyleConstants.ALIGN_JUSTIFIED); 

     int len = tp.getDocument().getLength(); 
     tp.setCaretPosition(len); 
     tp.setCharacterAttributes(aset, false); 
     tp.replaceSelection(msg); 
    } 

    public static void main(String... args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
      { 
       public void run() 
       { 
        new TextPaneTest(); 
       } 
      }); 
    } 
} 

ここで、出力は次のようになります。いくつかの基本的な着色(あなたがJTextAreaにして行うことができる唯一のこと)のために

JTextPane

+0

答えのためにありがとう、,,しかし言葉はダイナミックサー。?です。、静的ではありません。 – Celine

+0

@Celine:あなたのご歓迎と喜んでそれは何らかの形であなたを助けました。さて、この関数にあなたの言葉を一つずつ渡すだけでいいのですが、これはちょっとしたサンプルプログラムです。あなたはあなたのニーズに応じて言葉を供給するためのロジックを見つけなければなりません: –

+0

JFrameの色を青から緑に変えましたか? – vijay

3

HTMLでJEditorPaneを使用するか、要素を色づけするカスタムドキュメントを書き込むことができます。

2

JTextAreaでは、異なる色で異なる文字を使用することはできません(少なくとも複雑なハッピーなしでは)。代わりにJTextPaneまたはJEditorPaneを使用してください。次に、あなたがアクセスすることができ、そのStyledDocument

EDITED
StyledDocument sdoc = pane.getStyledDocument() 

:変更を直接個々の色を変更するgetStyledDocumentを呼び出して、代わりのStyledDocument

コールsetCharacterAttributesをのgetDocument()の結果をキャストします文字または部分文字列。

20

JTextAreaの可能な使用Highlighter(またはHTML)、例えば、オプションより可変あるJTextPaneと比較におけるstylledテキスト

enter image description here

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

public class TextPaneHighlighting { 

    private static final long serialVersionUID = 1L; 
    private Highlighter.HighlightPainter cyanPainter; 
    private Highlighter.HighlightPainter redPainter; 

    public TextPaneHighlighting() { 
     JFrame frame = new JFrame(); 
     JTextPane textPane = new JTextPane(); 
     textPane.setText("one\ntwo\nthree\nfour\nfive\nsix\nseven\neight\n"); 
     JScrollPane scrollPane = new JScrollPane(textPane); 
     frame.add(scrollPane, BorderLayout.CENTER);// Highlight some text 
     cyanPainter = new DefaultHighlighter.DefaultHighlightPainter(Color.cyan); 
     redPainter = new DefaultHighlighter.DefaultHighlightPainter(Color.red); 
     try { 
      textPane.getHighlighter().addHighlight(0, 3, DefaultHighlighter.DefaultPainter); 
      textPane.getHighlighter().addHighlight(8, 14, cyanPainter); 
      textPane.getHighlighter().addHighlight(19, 24, redPainter); 
     } catch (BadLocationException ble) { 
     } 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setPreferredSize(new Dimension(300, 200)); 
     frame.setLocationRelativeTo(null); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       TextPaneHighlighting tph = new TextPaneHighlighting(); 
      } 
     }); 
    } 
} 

用縮小オプションを実装このAPIであるのでHTMLでまたはHTMLなしの蛍光ペン、フォント、またはHTMLを使用して、または直接によって内部の別のJComponentを入れて(あまりにもJTextAreaのを知っているが...)

enter image description here

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

public class Fonts implements Runnable { 

    private String[] fnt; 
    private JFrame frm; 
    private JScrollPane jsp; 
    private JTextPane jta; 
    private int width = 450; 
    private int height = 300; 
    private GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
    private StyledDocument doc; 
    private MutableAttributeSet mas; 
    private int cp = 0; 
    private Highlighter.HighlightPainter cyanPainter = new DefaultHighlighter.DefaultHighlightPainter(Color.cyan); 
    private Highlighter.HighlightPainter redPainter = new DefaultHighlighter.DefaultHighlightPainter(Color.red); 
    private Highlighter.HighlightPainter whitePainter = new DefaultHighlighter.DefaultHighlightPainter(Color.white); 
    private int _count = 0; 
    private int _lenght = 0; 

    public Fonts() { 
     jta = new JTextPane(); 
     doc = jta.getStyledDocument(); 
     jsp = new JScrollPane(jta); 
     jsp.setPreferredSize(new Dimension(height, width)); 
     frm = new JFrame("awesome"); 
     frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frm.setLayout(new BorderLayout()); 
     frm.add(jsp, BorderLayout.CENTER); 
     frm.setLocation(100, 100); 
     frm.pack(); 
     frm.setVisible(true); 
     jta.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); 
     fnt = ge.getAvailableFontFamilyNames(); 
     mas = jta.getInputAttributes(); 
     new Thread(this).start(); 
    } 

    @Override 
    public void run() { 
     for (int i = 0; i < fnt.length; i++) { 
      StyleConstants.setBold(mas, false); 
      StyleConstants.setItalic(mas, false); 
      StyleConstants.setFontFamily(mas, fnt[i]); 
      StyleConstants.setFontSize(mas, 16); 
      dis(fnt[i]); 
      try { 
       Thread.sleep(75); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      StyleConstants.setBold(mas, true); 
      dis(fnt[i] + " Bold"); 
      try { 
       Thread.sleep(75); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      StyleConstants.setItalic(mas, true); 
      dis(fnt[i] + " Bold & Italic"); 
      try { 
       Thread.sleep(75); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      StyleConstants.setBold(mas, false); 
      dis(fnt[i] + " Italic"); 
      try { 
       Thread.sleep(75); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
     jta.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); 
    } 

    public void dis(String s) { 
     _count++; 
     _lenght = jta.getText().length(); 
     try { 
      doc.insertString(cp, s, mas); 
      doc.insertString(cp, "\n", mas); 
     } catch (Exception bla_bla_bla_bla) { 
      bla_bla_bla_bla.printStackTrace(); 
     } 
     if (_count % 2 == 0) { 
      try { 
       jta.getHighlighter().addHighlight(1, _lenght - 1, cyanPainter); 
      } catch (BadLocationException bla_bla_bla_bla) { 
      } 
     } else if (_count % 3 == 0) { 
      try { 
       jta.getHighlighter().addHighlight(1, _lenght - 1, redPainter); 
      } catch (BadLocationException bla_bla_bla_bla) { 
      } 
     } else { 
      try { 
       jta.getHighlighter().addHighlight(1, _lenght - 1, whitePainter); 
      } catch (BadLocationException bla_bla_bla_bla) { 
      } 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       Fonts fs = new Fonts(); 
      } 
     }); 
    } 
} 
+1

それはBGだけでなく、テキストの色も変更できますか? –

+0

@Lennart Rolland JTextAreaのための1つの色、JTextPaneのために、fore&backgroundを設定することが可能です – mKorbel

0

あなたはこのような何かを背景と前景の色を変更することができますが、これは当然のすべてのテキストを色付けします:

textArea.setBackground(Color.ORANGE); 
    textArea.setForeground(Color.RED); 

あなたが得る結果:

enter image description here

関連する問題