J'ai besoin de savoir comment faire ceci:
Disons: j'ai un code dans la JTextArea
comme ceci:
LOAD R1, 1
DEC R1
STORE M, R1
ADD R4, R1,8
Je voulais changer la couleur de LOAD
, DEC
, STORE
et ADD
en couleur BLEU R1
, R4
en couleur verte M
en ROUGE Nombres en ORANGE
Comment changer la couleur de ce texte? Ces textes proviennent du bloc-notes ou peuvent être saisis directement dans la zone de texte.
JTextArea
est destiné à divertir Plain Text
. Les paramètres appliqués à un seul caractère s'appliquent à l'ensemble du document dans JTextArea
. Mais avec JTextPane
ou JEditorPane
vous avez le choix de colorer votre String Literals
selon vos préférences. Ici, avec l’aide de JTextPane , vous pouvez le faire comme ceci:
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();
}
});
}
}
voici la sortie:
comme il est possible d'utiliser Highlighter
(ou HTML) pour JTextArea
, cette API implémentant des options réduites pour le texte styllé
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();
}
});
}
}
par rapport à JTextPane
, il existe des options plus variables, par exemple. Surligneur, avec HTML ou sans HTML, police ou insérer un autre composant JComponent en utilisant HTML ou directement (connaissez aussi JTextArea, mais ...)
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();
}
});
}
}
Use peut utiliser un JEditorPane avec HTML ou écrire un document personnalisé colorant les éléments.
Vous ne pouvez pas avoir différents caractères de différentes couleurs dans un JTextArea (du moins pas sans un piratage complexe). Utilisez plutôt un JTextPane ou un JEditorPane. Ensuite, vous pouvez accéder à sa StyledDocument
:
StyledDocument sdoc = pane.getStyledDocument()
EDIT&EACUTE;: a changé pour appeler directement getStyledDocument
, au lieu de convertir le résultat de getDocument ()
Appelez setCharacterAttributes
sur la StyledDocument
pour changer les couleurs de caractères ou de sous-chaînes individuels.
Pour certaines couleurs de base (la seule chose que vous puissiez faire avec JTextArea), vous pouvez modifier les couleurs d’arrière-plan et de premier plan de la même manière, mais ceci colorera tout le texte:
textArea.setBackground(Color.ORANGE);
textArea.setForeground(Color.RED);
Le résultat que vous obtenez:
Juste une autre alternative. Pour la théorie, voir d'autres réponses.
Celui-ci utilise des styles préconfigurés comme champs. Faites attention lorsque vous exposez ces champs tels quels, 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) { }
}
}
[Éditer] est redevenu insertString
au lieu de replaceSelection
car ce dernier échoue lorsque le volet n'est pas éditable
Juste une autre alternative. Pour la théorie, voir d'autres réponses.
Celui-ci crée des attributs lors de l'ajout de texte, au lieu de dériver le style comme dans la réponse de Nice cOw. La fonctionnalité est la même, car le volet fusionnera les attributs avec tous les attributs précédemment utilisés.
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) { }
}
}
[Éditer] est redevenu insertString
au lieu de replaceSelection
car ce dernier échoue lorsque le volet n'est pas éditable