Как изменить цвет текста в JtextArea?
Мне нужно знать, как это сделать:
Скажем: у меня есть код в jtextArea, как это,
LOAD R1, 1 DEC R1 STORE M, R1 ADD R4, R1,8
- Фоновое изображение JFrame
- Как получить, какой JRadioButton выбран из ButtonGroup
- Определите, как щелкнуть компонент JPanel в MouseListener. Обработка событий
- Как использовать ключевые привязки вместо ключевых прослушивателей
- ActionListener для конкретного текста внутри JTextArea?
Я хотел изменить цвет LOAD, DEC, STORE и ADD, чтобы покрасить BLUE R1, R4, чтобы покрасить зеленые M в красные цифры в ORANGE
Как изменить цвет этого текста? Этот текст был из блокнота или может быть непосредственно напечатан в textArea.
Заранее спасибо.
- Почему мои вещи не отображаются в JFrame?
- Как рисовать одно и то же движущееся изображение несколько раз?
- Является ли это правильным способом использования Java 2D Graphics API?
- Ключевые привязки и ключевые слушатели в Java
- Java-цикл игры (живопись) замораживает мое окно
- Воспроизведение нескольких аудиоклипов с использованием объектов Clip
- JComboBox в ячейке JTable
- Получить компонент Swing по имени
JTextArea
предназначен для размещения 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(); } }); } }
вот Результат:
так как возможно использовать Highlighter
(или Html) для JTextArea
, этот 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
есть опции, более переменные, например Highlighter, с Html или без Html, Font или другие JComponent внутри, используя Html или напрямую (знаю 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(); } }); } }
Использование может использовать JEditorPane с HTML или написать собственный документ, который окрашивает элементы.
Вы не можете иметь разные символы в разных цветах в JTextArea (по крайней мере, не без сложного хакера). Вместо этого используйте JTextPane или JEditorPane. Затем вы можете получить доступ к своему StyledDocument
:
StyledDocument sdoc = pane.getStyledDocument()
EDITED : изменено на прямой вызов getStyledDocument
, вместо того, чтобы вызывать результат getDocument ()
Вызовите setCharacterAttributes
на StyledDocument
чтобы изменить цвета отдельных символов или подстрок.
Для некоторых основных раскрасок (единственное, что вы можете сделать с JTextArea) вы можете изменить цвет фона и переднего плана на что-то вроде этого, но это будет окрасить весь текст, конечно:
textArea.setBackground(Color.ORANGE); textArea.setForeground(Color.RED);
Результат:
Еще одна альтернатива. Для теории см. Другие ответы.
Это создает атрибуты при добавлении текста вместо того, чтобы выводить стиль, как в ответе nIcE cOw. Функциональные возможности совпадают, так как панель объединяет атрибуты с любыми ранее использованными атрибутами.
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) { } } }
[Edit] изменен на insertString
вместо replaceSelection
потому что последнее не работает, когда панель не редактируется
Еще одна альтернатива. Для теории см. Другие ответы.
В этом поле используются предварительно сконфигурированные стили. Следите за тем, чтобы выставлять эти поля такими, какие они есть, ehm, mutable.
public final class SomeClass { private final JTextPane textPane = new JTextPane(); private final MutableAttributeSet attributes1; private final MutableAttributeSet attributes2; public SomeClass() { attributes1 = new SimpleAttributeSet(textPane.getInputAttributes()); StyleConstants.setForeground(attributes1, Color.BLACK); StyleConstants.setBackground(attributes1, Color.GREEN); attributes2 = new SimpleAttributeSet(textPane.getInputAttributes()); StyleConstants.setForeground(attributes2, Color.WHITE); StyleConstants.setBackground(attributes2, Color.RED); } private void print(String msg, AttributeSet attributes) { try { textPane.getStyledDocument().insertString(textPane.getDocument().getLength(), msg, attributes); } catch (BadLocationException ignored) { } } }
[Edit] изменен на insertString
вместо replaceSelection
потому что последнее не работает, когда панель не редактируется