setfont font java swing jtextarea jtextcomponent setbackground

java - setfont - jtextarea set font



¿Cómo cambiar el color del texto en JtextArea? (7)

El uso puede usar un JEditorPane con HTML o escribir un documento personalizado que coloree los elementos.

Necesito saber cómo hacer esto:

Digamos: tengo un código en jtextArea como este,

CARGAR R1, 1 DEC R1 GUARDAR M, R1 AGREGAR R4, R1,8

Quería cambiar el color de LOAD, DEC, STORE y ADD para colorear BLUE R1, R4 para colorear números M verdes a RED en NARANJA

Cómo cambiar el color de este texto? Estos textos eran de un bloc de notas o pueden escribirse directamente en el área de texto.

Gracias de antemano.


No puede tener diferentes caracteres en diferentes colores en un JTextArea (al menos no sin algunos complejos hackers). Use un JTextPane o JEditorPane en su lugar. Luego puede acceder a su StyledDocument :

StyledDocument sdoc = pane.getStyledDocument()

EDITADO : cambiado a llamar directamente a getStyledDocument , en lugar de lanzar el resultado de getDocument ()

Llame a setCharacterAttributes en StyledDocument para cambiar los colores de los caracteres o subcadenas individuales.


Para algunos colores básicos (lo único que puedes hacer con JTextArea) puedes cambiar el fondo y los colores de primer plano a algo como esto, pero esto coloreará todo el texto por supuesto:

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

El resultado que obtienes:


Solo otra alternativa. Para la teoría, mira otras respuestas.

Éste usa estilos preconfigurados como campos. Tenga cuidado al exponer estos campos tal como son, 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) { } } }

[Editar] volvió a insertString lugar de replaceSelection porque este último falla cuando el panel no es editable


Solo otra alternativa. Para la teoría, mira otras respuestas.

Este crea atributos al agregar texto, en lugar de derivar el estilo como en la respuesta de nIcE cOw. La funcionalidad es la misma, ya que el panel fusionará los atributos con los atributos utilizados anteriormente.

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) { } } }

[Editar] volvió a insertString lugar de replaceSelection porque este último falla cuando el panel no es editable


ya que es posible utilizar Highlighter (o Html) para JTextArea , esta API implementa opciones reducidas para texto con estilo

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

en comparación con JTextPane hay opciones más variables, por ejemplo, Highlighter, con Html o sin Html, Font, o poner otro JComponent dentro usando Html o directamente (también se conoce JTextArea, pero ...)

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


JTextArea está destinado a entretener Plain Text JTextArea . La configuración aplicada a un solo carácter se aplica a todo el documento en JTextArea . Pero con JTextPane o JEditorPane tienes la opción de JEditorPane tus String Literals acuerdo con tu gusto. Aquí con la ayuda de JTextPane , puedes hacerlo así:

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

aquí está la salida: