Foros del Web » Programación para mayores de 30 ;) » Java »

No consigo seleccionar todo el texto en un jTextField

Estas en el tema de No consigo seleccionar todo el texto en un jTextField en el foro de Java en Foros del Web. Hola Comunidad. Estoy creando una clase que hereda de JTextField. La idea es tener un campo con una propiedad Mensaje. (Vendría a ser algo parecido ...
  #1 (permalink)  
Antiguo 04/04/2012, 06:43
Avatar de ArcNexus  
Fecha de Ingreso: abril-2012
Ubicación: Donde uno se da cuenta de que no sabe nada
Mensajes: 69
Antigüedad: 12 años, 8 meses
Puntos: 4
No consigo seleccionar todo el texto en un jTextField

Hola Comunidad.

Estoy creando una clase que hereda de JTextField. La idea es tener un campo con una propiedad Mensaje. (Vendría a ser algo parecido a Tooltiptext, pero dentro del propio control)

Mi intención y eso ya me lo hace bien es que al recibir el foco, si el valor del campo está vacío se llene con el String contenido dentro de la propiedad Mensaje. y que ese texto quede seleccionado para que cuando el usuario escriba el mensaje desaparezca. Todo me funciona bien menos que no me selecciona.

Estoy usando Substance como lookandFeel (lo digo por si eso puede influir)

Aquí os dejo el código de la clase, por si alguna alma caritativa me quiere echar un vistazo y ayudarme.

Gracias

Código:
package Controles;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JTextField;
import javax.swing.border.LineBorder;


/**
 *
 * @author ArcNexus
 */
public class jCampoTextoSimple extends  JTextField  {
    private String Mensaje = "mensaje para el control";
    private String cTexto;

    public jCampoTextoSimple(){
//        super();
        setOpaque(false);
        //setBorder(new LineBorder(new Color(140,96,39), 1, false));
        setPreferredSize(new Dimension(100,29));
        this.setFont(new Font("Dejavu Sans", 0, 12));
        this.setText("jCampoTextoSimple");
        this.setForeground(new Color(83,59,35));
        this.setBackground(new Color(255, 255, 255));
        this.setSelectionColor(Color.ORANGE);
         this.addFocusListener(new FocusAdapter() {
        @Override
	public void focusGained(FocusEvent e) {
                      
           setBackground(new Color(243 ,232, 212));
           setFont(new Font("DejavuSans", 1, 12));
           //Compruebo texto del control, si es el mensaje del control lo
           //preparo con selectAll() para que se borre al pulsar una tecla
           cTexto = getText().trim();
            if ("".equals(getText())) {
                setText(Mensaje);
                selectAll();
            } else {
                System.out.println(getText()+ " "+ Mensaje);
                if (cTexto.equals(Mensaje)) {
                    selectAll();
                } else {
                    select(0,0);
                }
                select(0,0);
            }
                   }
        });
        
        this.addFocusListener(new FocusAdapter() {
        @Override
	public void focusLost(FocusEvent e) {
           setBackground(new Color(255 ,255, 255));
           setFont(new Font("Dejavu Sans",0,12));
           if(  "".equals(getText())){
               setText(Mensaje);
               setForeground(new Color(217,198,180));
               select(0, 0);
           } else
               setForeground(new Color (83,59,35));
               
           }
        });
                }
    
     public String getMensaje() {
        return Mensaje;
    }
    public void setMensaje(String Mensaje) {
        this.Mensaje = Mensaje;
    }
__________________
Cuando compartimos, todos ganamos y crecemos.
mi blog:http://milinuxblog.informatica-intelligent.com
(Linux, Java y software libre)
  #2 (permalink)  
Antiguo 04/04/2012, 18:08
Avatar de FiruzzZ  
Fecha de Ingreso: diciembre-2007
Ubicación: en casa
Mensajes: 470
Antigüedad: 17 años
Puntos: 41
Respuesta: No consigo seleccionar todo el texto en un jTextField

Con algunos retoques funciona, no al 100% como lo ideaste pero es un avance
Código Java:
Ver original
  1. @Override
  2.     public void focusGained(FocusEvent e) {
  3.                      
  4.            setBackground(new Color(243 ,232, 212));
  5.            //setFont(new Font("DejavuSans", 1, 12));  //comentando esta linea funciona
  6.            //Compruebo texto del control, si es el mensaje del control lo
  7.            //preparo con selectAll() para que se borre al pulsar una tecla
  8.            cTexto = getText().trim();
  9.             if ("".equals(getText())) {
  10.                 setText(Mensaje);
  11.                 selectAll();
  12.             } else {
  13.                 System.out.println(getText()+ " "+ Mensaje);
  14.                 if (cTexto.equals(Mensaje)) {
  15.                     selectAll();
  16.                 } else {
  17.                     select(0,0);
  18.                 }
  19.  // la siguiente linea no tiene sentido, porque sobreescribe la lógica que está dentro
  20. // de  esta condición if (cTexto.equals(Mensaje))
  21. //                select(0,0);
  22.             }
  23.                    }
  24.         });
  25.        
  26.         this.addFocusListener(new FocusAdapter() {
  27.         @Override
  28.     public void focusLost(FocusEvent e) {
  29.            setBackground(new Color(255 ,255, 255));
  30.            setFont(new Font("Dejavu Sans",0,12));
  31.            if(  "".equals(getText())){
  32.                setText(Mensaje);
  33.                setForeground(new Color(217,198,180));
  34. //               select(0, 0); // esta tampoco tiene sentido, porque el componenete ya perdió el foco
  35.            } else
  36.                setForeground(new Color (83,59,35));
  37.                
  38.            }
  39.         });

No tengo idea de porqué setFont(new Font("DejavuSans", 1, 12));, en focusGained está interfiriendo con la lógica que le presede.. pero bue
Por curiosidad, ¿Qué IDE estás usando?

PD: cuando usas el tag para enmarcar código, especificale un lenguaje, lo hace mas legible ;).. saludos


aaah.. me acabo de dar cuenta.. que estás agregando 2 FocusAdapter, en vez de UNO SOLO y @Override ambos métodos (no soluciona tu problema pero simplifica el código)
__________________
BadProgrammerException!

Última edición por FiruzzZ; 04/04/2012 a las 18:20
  #3 (permalink)  
Antiguo 04/04/2012, 18:55
Avatar de ArcNexus  
Fecha de Ingreso: abril-2012
Ubicación: Donde uno se da cuenta de que no sabe nada
Mensajes: 69
Antigüedad: 12 años, 8 meses
Puntos: 4
Respuesta: No consigo seleccionar todo el texto en un jTextField

Cita:
Iniciado por FiruzzZ Ver Mensaje
Con algunos retoques funciona, no al 100% como lo ideaste pero es un avance

No tengo idea de porqué setFont(new Font("DejavuSans", 1, 12));, en focusGained está interfiriendo con la lógica que le presede.. pero bue
Por curiosidad, ¿Qué IDE estás usando?
Netbeans 7.1.1 para Linux (ArchLinux) -Es raro lo de que el culpable sea el cambiar el tipo de letra.... En fin, cosas de la programación. Voy a probar a ver si con Eclipse hace lo mismo.

Cita:
Iniciado por FiruzzZ Ver Mensaje
PD: cuando usas el tag para enmarcar código, especificale un lenguaje, lo hace mas legible ;).. saludos


aaah.. me acabo de dar cuenta.. que estás agregando 2 FocusAdapter, en vez de UNO SOLO y @Override ambos métodos (no soluciona tu problema pero simplifica el código)
Tendré en cuenta lo de especificar un lenguaje al especificar código. No sabía que se podía hacer.

Muchas gracias por tu ayuda, voy a probar a ver que tal. Me desesperan estos fallos tontos, eso de ser novato es un fastidio.
__________________
Cuando compartimos, todos ganamos y crecemos.
mi blog:http://milinuxblog.informatica-intelligent.com
(Linux, Java y software libre)

Etiquetas: clase, jtextfield, string, todo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:56.