如何更改JtextArea中的文本颜色?
我需要知道如何做到这一点:
让我们说:我有这样的jtextArea中的代码,
LOAD R1,1 DEC R1存储M,R1 ADD R4,R1,8
我想改变LOAD,DEC,STORE和ADD的颜色为蓝色R1,R4,绿色M,红色,橙色,橙色
如何改变这个文本的颜色? 这些文本是从记事本或可以直接键入到textArea。
先谢谢你。
JTextArea
是为了招待Plain Text
。 应用于单个字符的设置适用于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
Highlighter
(或Html),这个API实现了简化文本选项
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(); } }); } }
与JTextPane
相比,有更多的variables选项,例如Highlighter,使用Html或没有Html,Font,或者通过使用Html或直接使用另一个JComponent(也知道JTextArea,但是…)
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(); } }); } }
使用可以使用带有HTML的JEditorPane,也可以编写一个为元素添加颜色的自定义文档。
在JTextArea中不能有不同的颜色(至less不是没有一些复杂的hackery)。 改为使用JTextPane或JEditorPane。 然后你可以访问它的StyledDocument
:
StyledDocument sdoc = pane.getStyledDocument()
EDITED : 改为直接调用getStyledDocument
,而不是转换getDocument()的结果
在StyledDocument
上调用StyledDocument
以更改单个字符或子string的颜色。
对于一些基本的着色(你可以用JTextArea做的唯一的事情),你可以改变背景和前景颜色为这样的东西,但是这将会使所有的文字变色:
textArea.setBackground(Color.ORANGE); textArea.setForeground(Color.RED);
你得到的结果是: