Red de conocimiento informático - Aprendizaje de programación - ¡Escriba código fuente para un editor de texto que pueda probarse y transmitirse en lenguaje Java! ¡Puede ejecutarse con Eclipse!

¡Escriba código fuente para un editor de texto que pueda probarse y transmitirse en lenguaje Java! ¡Puede ejecutarse con Eclipse!

uno. Contenido destacado:

El contenido que debe resaltarse es:

1. Palabras clave, como public, int, true, etc.

2. Operadores, como , -, *, etc.

3. Operadores, como , -, *, /, etc.

3. Números

4. Resalte cadenas, como "Ejemplo de cadena"

5. Resalte comentarios de una sola línea.

6. Resaltar comentarios de varias líneas

II. Método principal para implementar el resaltado:

StyledDocument.setCharacterAttributes(int offset, int length, AttributeSet s, boolean replace)

III. Selección del editor de texto.

Java proporciona un editor de texto multilínea: puedes usar JTextComponent, JTextArea, JTextPane, JEditorPane, etc. Sin embargo, estos editores de texto utilizan documentos StyledDocuments debido a los diversos estilos utilizados al colorear la sintaxis del texto.

JTextArea utiliza un PlainDocument, que no se puede colorear en varios formatos.

JTextPane y JEditorPane utilizan StyledDocument, que está disponible de forma predeterminada.

Para implementar el color de sintaxis, puede heredar DefaultStyledDocument y configurarlo como documento para estos editores de texto, o puede hacerlo directamente usando JTextPane y JEditorPane. Por conveniencia, aquí usamos JTextPane directamente.

4. Cuándo colorear.

Cuando se inserta o elimina un carácter en un editor de texto, el contenido del texto cambiará y deberá ser inspeccionado y coloreado.

Para monitorear el contenido de texto modificado, agregue un detector DocumentListener al documento, coloreándolo en removeUpdate e insertUpdate.

Cuando el color de primer plano, el color de fondo, la fuente y otros atributos del texto cambian, se llamará al método changeUpdate.

@Override

public void cambiadoUpdate(DocumentEvent e) {

}

@Override

public void insertUpdate(DocumentEvent e) {

prueba {

colouring((StyledDocument) e.getDocument(), e.getOffset(), e.getLength());

} catch (BadLocationException e1) {

e1.printStackTrace()

}

}

@Override

public void removeUpdate(DocumentEvent e) {

try {

// Porque eliminar // Porque el cursor está inmediatamente a cada lado de la palabra afectada por el eliminación, la longitud no es necesaria

colouring((StyledDocument) e.getDocument(), e.getOffset(), 0);

} catch (BadLocationException e1) {

e1.printStackTrace();

}

5. Rango de color:

pos: se refiere a la posición del cursor antes del cambio.

len: El número de caracteres cambió.

Por ejemplo, si la palabra clave es pública, int

"publicint", inserte un espacio entre "public" e "int", se convierte en "public int", una palabra se convierte en dos palabras, luego colorea "público" e "int".

El rango de coloración es public en la posición p e int en la posición t más 1, es decir, la palabra antes del subíndice inicial pos y el subíndice final de la palabra inicial pos len. Por lo tanto, el rango que se va a colorear en el ejemplo anterior es "public int".

El método indexOfWordStart se proporciona para obtener el subíndice del comienzo de la palabra antes de pos, y el método indexOfWordEnd se proporciona para obtener el subíndice del final de la palabra después de pos.

public int indexOfWordStart(Document doc, int pos) throws BadLocationException {

// Encuentra el primer carácter que no sea una palabra a partir de pos.

for (; pos gt; 0 amp; amp; isWordCharacter(doc, pos - 1); --pos

return pos

}

public int indexOfWordEnd(Document doc, int pos) throws BadLocationException {

// Busca hacia adelante desde pos el primer carácter que no sea una palabra.

for (; isWordCharacter(doc, pos); pos);

return pos

}

El carácter es válido; Carácter de palabra: Es una letra, número o guión bajo.

public boolean isWordCharacter(Document doc, int pos) throws BadLocationException {

char ch = getCharAt(doc, pos) // Obtiene el carácter en la posición pos en el documento.Character);

if (Character.isLetter(ch) || Character.isDigit(ch) || ch == '_')

devuelve falso

}

Por lo tanto, el rango de coloración es [inicio, fin]:

int start = indexOfWordStart(doc, pos

int end = indexOfWordEnd(doc, pos); ) len);

VI.Coloración de palabras clave.

Juzgue el subíndice desde el principio del rango de coloración. Si comienza con una letra o un guión bajo, es una palabra. Si la palabra es una palabra clave, realice la coloración de palabras clave. No, realice la coloración normal. Si la palabra es una palabra clave, coloree la palabra clave; si no, coloree la palabra clave. Después de colorear las palabras, continúa el proceso de coloración. Los caracteres que ya están coloreados no serán coloreados.

public void colouring(StyledDocument doc, int pos, int len) throws BadLocationException {

// Obtiene las palabras afectadas por la inserción o eliminación.

// Por ejemplo, si agrega un espacio después de b al insertar "público", se convertirá en "pub lic": "Hay dos palabras para procesar: "pub" y "lic"

// // El rango a obtener es la posición antes de p en pub y la posición después de c en lic

int start = indexOfWordStart(doc, pos

<); p> int end = indexOfWordEnd(doc, pos len);

char ch;

while (start lt; end) {

ch = getCharAt(doc) , inicio);

if (Character.invokeLater(new ColouringTask(doc, pos, wordEnd - pos, normalStyle));

inicio;

}

}

}

public int colouringWord(StyledDocument doc, int pos) lanza BadLocationException {

int wordEnd = indexOfWordEnd(doc, pos);

String word = doc.getText(pos, wordEnd - pos); // La palabra a colorear

if (keywords.contains(word)) {

// Si es una palabra clave, coloree la palabra clave; de ​​lo contrario, use la coloración normal

// Una cosa a tener en cuenta aquí es que no puede modificar el documento durante las llamadas a los métodos insertUpdate y removeUpdate

// Pero queremos poder modificar las propiedades del documento, por lo que colocaremos esta tarea fuera de este método.

// Esto se puede hacer usando un nuevo hilo. pero sería más fácil ponerlo en la cola de eventos de Swing invokeLater(new ColoringTask(doc, pos, wordEnd - pos, normalStyle));

}

return wordEnd;

}

Debido a que en los métodos insertUpdate y removeUpdate, la tarea de colorear se coloca fuera de estos métodos, use SwingUtilities.invokeLater para implementarla.

la clase privada ColoringTask implementa Runnable {

doc StyledDocument privado

estilo de estilo privado

private int pos; >

privado int len;

público ColoringTask(StyledDocument doc, int pos, int len, estilo estilo) {

this.doc = doc;

this.pos = pos;

this.len = len;

this.style = estilo

}

public void; run() {

try {

// Aquí es donde coloreas los caracteres

doc.setCharacterAttributes(pos, len, style, true); p>

} catch (Excepción e) {}

}

}

}

VII: Código fuente

El código completo para colorear palabras clave se muestra a continuación y se puede compilar y ejecutar. La coloración de números, operadores, cadenas, etc. se explicará con más detalle en futuros tutoriales.

importar java.awt.Color

importar javax.swing.JTextPane

importar javax.swing.SwingUtilities

importar javax.swing.event.DocumentListener;

importar java.awt.Color

importar java.util.p>importar javax.swing.text.Style;

importar javax.swing.text.StyleConstants;

importar javax.swing.text.StyleConstants;

importar javax.swing.text.StyleConstants.

clase pública HighlightKeywordsDemo {

public static void main(String[] args) {

JFrame frame = new JFrame();

JTextPane editor = new JTextPane(

editor.getDocument().addDocumentListener(new SyntaxHighlighter(editor));

frame.getContentPane().add( editor); .setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setSize(500, 500).addDocumentListener(new SyntaxHighlighter(editor));

palabras clave privadas; >

estilo privado estilo palabra clave;

estilo privado estilo normal;

resaltador de sintaxis público (editor JTextPane) {

// Preparar estilos para colorear

p>

palabra claveStyle = ((StyledDocument) editor.getDocument()).addStyle("Keyword_ Style", null);

normalStyle = ((StyledDocument) editor.getDocument()).addStyle( "Keyword_Style", null);

StyleConstants.setForeground(keywordStyle)setForeground(keywordStyle, Color.RED);

StyleConstants.setForeground(normalStyle, Color.BLACK);

// Preparar palabras clave

palabras clave = new HashSetlt (); p>

palabras clave.add("protected");

palabras clave.add("privado");

palabras clave.add("_int9");

palabras clave.add("float");

palabras clave.add("double");

}

coloración pública vacía (StyledDocument doc, int pos, int len) throws BadLocationException {

// Obtiene las palabras afectadas por la inserción o eliminación.

// Por ejemplo, si agrega un espacio después de b al insertar "público", se convertirá en "pub lic": "Hay dos palabras para procesar: "pub" y "lic"

// // El rango a obtener es la posición antes de p en pub y la posición después de c en lic

int start = indexOfWordStart(doc, pos

<); p> int end = indexOfWordEnd(doc, pos len);

char ch;

while (start lt; end) {

ch = getCharAt(doc) , start);

if (Character.isLetter(ch) || ch == '_') {

// si comienza con una letra o guión bajo, es un palabra

// pos es el último subíndice después del procesamiento

inicio = colorearPalabra(doc, inicio);

} else {

SwingUtilities.invokeLater(new ColoringTask(doc, start, 1, normalStyle));

start

}

}

}

/**

* Colorea la palabra y devuelve el subíndice al final de la palabra

*

* @param. doc

* @param pos

* @return

* @throws BadLocationException

*/

público int colouringWord (StyledDocument doc, int pos) lanza BadLocationException {

int wordEnd = indexOfWordEnd(doc, pos);

String word = doc.getText(pos, wordEnd - pos);

if (keywords.contains(word)) {

// Si es una palabra clave, coloréala; de lo contrario, utilice el color normal.

// Una cosa a tener en cuenta aquí es que no puede modificar las propiedades del documento durante las llamadas a los métodos insertUpdate y removeUpdate.

// Pero queremos poder modificar las propiedades del documento, por lo que colocaremos esta tarea fuera de este método.

// Esto se puede hacer usando un hilo nuevo, pero es más fácil ponerlo en la cola de eventos de Swing. invokeLater(new ColoringTask(doc, pos, wordEnd - pos, normalStyle));

}

}

return wordEnd; }

/**

* Obtiene el carácter cuyo subíndice se encuentra en pos en el documento.

*

* Si pos es doc.getLength(), devuelve el final del documento sin generar una excepción. Si poslt;0 entonces se lanzará una excepción. getText(pos, 1).charAt(0);

}

/**

* Obtiene el subíndice al principio de la palabra pos. ?±wor^d?± (^ significa pos, ? ± significa subíndice inicial o final)

*

* @param doc

* @param pos

* @return

* @throws BadLocationException

*/

public int indexOfWordStart(Documento doc, int pos) lanza BadLocationException {

// Encuentra el primer carácter que no sea una palabra a partir de la pos.

for (; pos gt; 0 amp; amp; isWordCharacter(doc, pos - 1); --pos

return pos

}

/**

* Obtiene el índice al final de la palabra donde se encuentra el índice pos. ?±wor^d?± (^ significa pos, ? ± significa subíndice inicial o final)

*

* @param doc

* @param pos

* @return

* @throws BadLocationException

*/

public int indexOfWordEnd(Documento doc, int pos) lanza BadLocationException {

// Encuentra el primer carácter que no sea una palabra a partir de la pos.

for (; isWordCharacter(doc, pos);

return pos

}

/**

* Devuelve verdadero si el carácter es una letra, un número o un guión bajo.

param doc

* @param pos

* @return

* @throws BadLocationException

*/

public boolean isWordCharacter(Document doc, int pos) lanza BadLocationException {

char ch = getCharAt(doc, pos);

if (Character.isLetter(ch) || Character.isDigit (ch) || ch == '_')

Devuelve falso

}

@Override

public void cambiadoActualización( DocumentEvent e) {

}

@Override

public void insertUpdate(DocumentEvent e) {

prueba {

colorear((StyledDocument) e.getDocument(), e.getOffset(), e.getLength());

} catch (BadLocationException e1) {

e1.printStackTrace ();

}

}

}

@Override

public void removeUpdate( DocumentEvent e) {

try {

// No se requiere longitud ya que el cursor estará inmediatamente a cada lado de la palabra afectada después de la eliminación

colouring((StyledDocument) e .getDocument(), e.getOffset(), 0);

} catch (BadLocationException e1) {

e1.printStackTrace();

}

}

}

/**

* Completa la tarea de colorear

*

* @authorBiao

*

*/

clase privada ColoringTask implementa Runnable {

documento privado StyledDocument ;

estilo de estilo privado;<

private int pos;

private int len ​​

public ColoringTask(StyledDocument doc, int pos; , int len, estilo de estilo) {

this.doc = doc;

this.pos = pos

this.len = len; >

this.style = estilo;

}

publ

ic void run() {

try {

// Aquí es donde se colorean los caracteres.

doc.setCharacterAttributes(pos, len, estilo, verdadero

} catch (Excepción e) {}

}

}

}

}

}

}