Ejemplos java y C/linux

Tutoriales

Enlaces

Licencia

Creative Commons License
Esta obra está bajo una licencia de Creative Commons.
Para reconocer la autoría debes poner el enlace http://www.chuidiang.com

Seleccionar texto en un JTextArea.

Siguiendo con nuestro editor sencillo en java, vamos a hacer ahora la acción de menú de buscar texto. Aprenderemos a buscar texto y marcarlo dentro del JTextArea, así como lo raros que nos parecen los ingleses para los que no sabemos inglés. También veremos un ejemplo sencillo de cómo usar la clase JOptionPane.

Buscar y seleecionar el texto

Para buscar el texto, construimos un JMenuItem con una acción de buscar, de forma similar a como hicimos al construir el JMenuBar. Aquí sólo nos meteremos con la "chicha" del código, es decir, el método actionPerformed() de la Action que hagamos. Simplemente un detalle, para tener accesible desde la Action el JTextArea, podemos por ejemplo, pasárselo en el constructor, de esta forma

public class AccionBuscar extends AbstractAction
{
   // Para guardarse el JTextArea sobre la que trabajar
   private JTextArea areaTexto = null;

   // Constructor que recibe el JTextArea sobre la que trabajar
   // y se la guarda

   public AccionBuscar (JTextArea areaTexto)
   {
      this.areaTexto = areaTexto;
   }

   // El método que busca y selecciona lo buscado.
   public void actionPerformed (ActionEvent e)
   {
      // Aquí la "chicha" del código
   }
}

Hecha esta observación, vamos con el código. Lo primero que debe hacer esta acción es pedir al usuario el texto que quiere buscar. Para hacer pequeñas consultas al usuario, como preguntarle si sí o si no a una cosa, avisarle de un error, pedirle una cadena de texto o un número o darle a elegir entre una serie de ocpiones, tenemos la clase JOptionPane.

Esta clase dispone de varios métodos estilo showInputDialog(), showConfirmDialog(), showMessageDialog() y showOptionDialog(). En la API de JOptionPane puedes ver los detalles de todos ellos. Para nuestro caso que sólo queremos pedir un texto, nos vale el método showInputDialog().

A este método tenemos muchas posibilidades de llamada en función de los parámetros que queramos o podamos pasarle. Usaremos la variante que tiene estos tres parámetros:

Un código tan tonto como este

String textoABuscar = JOptionPane.showInputDialog(textArea, "Texto a buscar", "");

Nos mostrará una ventana tan maja como esta

dialogo de buscar texto con JOptionPane

Además, nuestro código se queda parado esperando que el usuario conteste a la ventana. Cuando introduzca el texto, el método showInputDialog() nos devolverá el texto introducido que, con el código que hemos puesto, se guardará en textABuscar.

Ahora la búsqueda. Basta pedirle al texto al areaTexto y buscar con el método indexOf() de String. El código puede ser así

String textoTotal = areaTexto.getText();
int posicion = textoTotal.indexOf(textoABuscar);

Esto nos devolverá en posicion la posición en la que se ha encontrado el texto a buscar. Si devuelve -1 es que no lo ha encontrado.

El texto que mostramos incialmente puede ser el seleccionado en el JTextArea si lo hay. JTextArea tiene un método getSelectedText() que nos devuelve el texto seleccionado o null si no hay nada

String textoInicialDeBusqueda = areaTexto.getSelectedText();
if (textoInicialDeBusqueda == null)
   textoInicialDeBusqueda = "";
String textoABuscar = JOptionPane.showInputDialog(textArea, "Texto a buscar", textoInicialDeBusqueda);

Seleccionar texto y ver texto seleccionado en el JTextArea

El JTextArea tiene una cosa que se llama Caret. El Caret este no es más que un rectángulo de otro color para texto seleccionado. Podemos obtener este rectángulo con el método getCaret() del JTextArea

Caret seleccion = areaTexto.getCaret();

Este Caret tiene dentro dos posiciones: en la que empieza el texto seleccionado y en la que termina la selección. Como estos ingleses son la leche, no se les ha ocurrido otra cosa que llamarlas "dot" y "mark". De forma que ambas posiciones se pueden obtener con getDot() y getMark(). Mark es la primera posición y Dot la última del texto seleccionado.

Si ambas posiciones son iguales, es que no hay nada seleccionado

if (seleccion.getDot() == seleccion.getMark())
{
   // No hay nada seleccionado
}
else
{
   // Hay texto seleccionadas
}

Esto nos sirve para saber la posición del texto seleccionado. De esta forma, podemos hacer nuestra búsqueda a partir de la posición en la que encontramos el texto previamente. Simulamos así una especie de buscar siguiente. Obtenemos, por tanto, la posicion inicial de búsqueda dentro del JTextArea así

int posicionInicial = 0;
if (seleccion.getDot() != seleccion.getMark())
{
   // Hay algo seleccionado
   posicionInicial = seleccion.getDot();
}

La búsqueda se realiza con el mismo método de antes, pero usando un método indexOf() que además de el texto a buscar admite la posición inicial de búsqueda.

String textoTotal = areaTexto.getText();
int posicion = textoTotal.indexOf(textoABuscar, posicionInicial);

Vale, ya lo hemos encontrado, ahora sólo queda seleccionar el nuevo texto encontrado. JTextArea tiene un método muy sencillo de usar que es select() al que le pasamos la posición inicial y la final. Como es tan sencillo, la gente de java en su API lo desaconsejan y nos indican que usemos los métodos setCaretPosition() y moveCaretPosition(), que son más mejores, más extraños y los que al final acaba llamando select().

setCaretPosition() pone tanto Dot como Mark en la posición indicada, es decir, hacen que no haya nada seleccionado y que ambos estén en esa posición.

moveCaretPosition() hace que Dot se mueva a la nueva posición, dejando a Mark en la anterior. De esta forma queda el texto seleccionado desde la posición Mark hasta la Dot.

¿Cual es la posición final de la selección?. Pues una cuenta simple, es la posición donde hemos encontrado el texto más la longitud del texto que hemos encontrado.

areaTexto.setCaretPosition(posicion);
areaTexto.moveCaretPosition(posicion + textoABuscar.length());

Ya está. Vamos ahora con el cortar, copiar y pegar.

Estadísticas y comentarios

Numero de visitas desde el 4 Feb 2007: