简体   繁体   中英

How can I display red text in a JTextArea?

我想在编译exec文件后用红色显示结果中的错误(文本),并使用java中的swing在gui的textarea中显示它。

A normal JTextArea doesn't support fancy things like different colors of text. However, there are similar components that do. See http://java.sun.com/docs/books/tutorial/uiswing/components/text.html

JEditorPane can get content formatted in HTML. The official Sun tutorial also gives some insight:

The JTextArea class provides a component that displays multiple lines of text and optionally allows the user to edit the text. If you need to obtain only one line of input from the user, you should use a text field. If you want the text area to display its text using multiple fonts or other styles, you should use an editor pane or text pane. If the displayed text has a limited length and is never edited by the user, use a label.

Here's a quick example of adding text to a JEditorPane using AttributeSet and StyleConstants.

This brings up a little frame with a JEditorPane and you can use it to add text of lots of colors without using HTML.

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

public class TextColor extends JFrame implements ActionListener {

  JTextPane myTextPane;
  JTextArea inputTextArea;

  public TextColor() {
    super();
    JPanel temp = new JPanel(new BorderLayout());
    inputTextArea = new JTextArea();
    JButton btn = new JButton("Add");
    btn.addActionListener(this);
    temp.add(btn, BorderLayout.SOUTH);
    temp.add(inputTextArea, BorderLayout.NORTH);
    this.getContentPane().add(temp, BorderLayout.SOUTH);
    myTextPane = new JTextPane();
    myTextPane.setBorder(new EtchedBorder());
    this.getContentPane().add(myTextPane, BorderLayout.CENTER);
    this.setSize(600, 600);
    this.setVisible(true);


  }

  public void actionPerformed(ActionEvent ae) {
    Color newTextColor = JColorChooser.showDialog(this, "Choose a Color", Color.black);
    //here is where we change the colors
    SimpleAttributeSet sas = new SimpleAttributeSet(myTextPane.getCharacterAttributes());
    StyleConstants.setForeground(sas, newTextColor);
    try {
      myTextPane.getDocument().insertString(myTextPane.getDocument().getLength(),
          inputTextArea.getText(), sas);
    } catch (BadLocationException ble) {
      ble.printStackTrace();
    }

  }

  public static void main(String args[]) {

    new TextColor();
  }

}

Smita,

take care to paste snippet of your code so that one can understand where exactly problem is or help is required.

Coming to your problem,

To the best of my knowledge, there is no way to set different colors for different text elements in textArea in java. You can set only one color for all.

Alternative is to use JTextPane.

See if following code helps your cause.

String text = "Some Text...";    //This can be any piece of string in your code like 
                                   output of your program...
JTextPane myTextPane = new JTextPane();

SimpleAttributeSet sas = new SimpleAttributeSet(myTextPane.getCharacterAttributes());


// As what error you were referring was not clear, I assume there is some code in your    
   program which pops out some error statement. For convenience I use Exception here..
if( text.contains("Exception") ) //Checking if your output contains Exception...
{
    StyleConstants.setForeground(sas, Color.red); //Changing the color of 
    StyleConstants.setItalic(sas, true);

    try
    {
       myTextPane.getDocument().insertString
       (
          myTextPane.getDocument().getLength(),
          text + "\n",
          sas
       );
    }
    catch( BadLocationException ble )
    {
        text.append(ble.getMessage());
    }
}
else
{
    StyleConstants.setForeground(sas, Color.GREEN);

    try
    {
       myTextPane.getDocument().insertString
       (
          myTextPane.getDocument().getLength(),
          text + "\n",
          sas
        );
    }
    catch(BadLocationException ble)
    {
        text.append(ble.getMessage());
    }
}

I guess this will solve your problem with few modifications.

Thanks.

Sushil

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM