有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何更改JTextArea中的文本颜色?

我需要知道如何做到这一点:

比如说:我在JTextArea中有一个这样的代码:

LOAD R1, 1
DEC R1
STORE M, R1
ADD R4, R1,8

我想把LOADDECSTOREADD的颜色改成蓝色 R1R4为绿色 M至红色 数字变成橙色

如何更改此文本的颜色? 这些文本来自记事本,也可以直接键入文本区域


共 (6) 个答案

  1. # 1 楼答案

    意思是娱乐。应用于单个字符的设置适用于JTextArea中的整个文档。但是JTextPaneJEditorPane你可以选择,根据你的喜好给你的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();
                    }
                });
        }
    }
    

    以下是输出:

    JTextPane

  2. # 2 楼答案

    对于一些基本颜色(使用JTextArea可以做的唯一事情),您可以将背景和前景颜色更改为类似的颜色,但这将为所有文本着色:

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

    结果是:

    enter image description here

  3. # 3 楼答案

    由于可以对JTextArea使用Highlighter(或Html),因此此API实现了简化的手写文本选项

    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();
                }
            });
        }
    }
    

    JTextPane相比,有更多可变的选项,例如荧光笔、带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();
                }
            });
        }
    }
    
  4. # 4 楼答案

    在JTextArea中不能有不同颜色的不同字符(至少在没有复杂的黑客攻击的情况下)。改用JTextPane或JEditorPane。然后您可以访问它的StyledDocument

    StyledDocument sdoc = pane.getStyledDocument()
    

    已编辑:更改为直接调用getStyledDocument,而不是强制转换getDocument()的结果

    StyledDocument上调用setCharacterAttributes以更改单个字符或子字符串的颜色

  5. # 5 楼答案

    Use可以将JEditorPane与HTML一起使用,也可以编写为元素着色的自定义文档

  6. # 6 楼答案

    只是另一种选择。有关理论,请参见其他答案

    这一个在添加文本时创建属性,而不是像nicecow的答案那样派生样式。功能是相同的,因为窗格将把属性与以前使用的任何属性合并

    public final class SomeClass {
        private final JTextPane           textPane = new JTextPane();
    
        private void print(String msg, Color foreground, Color background) {
            AttributeSet attributes = new SimpleAttributeSet(textPane.getInputAttributes());
            StyleConstants.setForeground(attributes, foreground);
            StyleConstants.setBackground(attributes, background);
    
            try {
                textPane.getStyledDocument().insertString(textPane.getDocument().getLength(), msg, attributes);
            } catch (BadLocationException ignored) { }
        }
    }
    

    [编辑]更改回insertString而不是replaceSelection,因为后者在窗格不可编辑时失败