Foro sobre Java SE > Error de principiante
En Java las comparaciones de String no se hacen con "==", ya los String son objetos a los que se accede mediante referencias y estarías comparando las referencias a los objetos, no los objetos en sí. Es decir, no compararías si el objeto apuntado por tu variable texto es igual al objeto declarado literalmente como "Nuevo Texto", sino si la variable texto apunta al mismo sitio que el literal "Nuevo Texto" que has declarado en tu código. Como puedes suponer, eso siempre va a devolver false.
En su lugar, tienes que usar los métodos de la clase String compareTo o compareToIgnoreCase:
if (texto.compareTo("Nuevo Texto") == 0 ) txtTexto.setText("Nuevo Texto 2");
Consejo: en la clase String, el método equals disponible en todos los objetos ha sido sobrescrito para que se comporte como compareTo, devolviendo true si las dos secuencias de caracteres de los objetos comparados son iguales entre sí (existe un método paralelo a imagen de compareToIgnoreCase, llamado equalsIgnoreCase). Normalmente esto no es así y, si no se sobrescribe explícitamente el método, equals devuelve true si las dos referencias apuntan al mismo objeto, tal y como te pasaba en tu comparación con "==".
rickiees
A mi me funcionó, cambia de Texto a Nuevo Texto... Fijate si agregandole los paquetes de cada Componente te funciona:
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.border.EmptyBorder;
Yo
Muchas gracias por vuestra ayuda.
La explicación de riskiees es perfecta y tiene todo el sentido del mundo. Como imaginé, era una cuestión de principiante en Java. El código lo modifiqué de la siguiente forma y funciona:
--------
public void CambiaTexto(){
String texto = txtTexto.getText();
if (texto.equals("Nuevo Texto") ) txtTexto.setText("Nuevo Texto 2");
else txtTexto.setText("Nuevo Texto");
}
-------
Saludos.
Nota: También revisé los pquetes y sí estaban importado.
agg007
Muchas gracias por vuestra ayuda.
La explicación de riskiees es perfecta y tiene todo el sentido del mundo. Como imaginé, era una cuestión de principiante en Java. El código lo modifiqué de la siguiente forma y funciona:
--------
public void CambiaTexto(){
String texto = txtTexto.getText();
if (texto.equals("Nuevo Texto") ) txtTexto.setText("Nuevo Texto 2");
else txtTexto.setText("Nuevo Texto");
}
-------
Saludos.
Nota: También revisé los pquetes y sí estaban importado.
agg007
Tambien podrías haber hecho con ==
Java permite tambien esas comparaciones, nada mas que tendrias que haber obtenido el texto del campo para compararlo con un String:
if (texto.getText()=="Nuevo Texto")
Yo
Quizá lo que comentas funcione ahora, que creo que java guarda una lista de los textos empleados y usa el mismo puntero, pero no tengo nada claro que funcione con versiones antiguas. Por ejemplo en 1.4 fijo que el operador == no funcionaria. En posteriores no lo aseguraría.
Para comparar Strings ya tenemos el equal que compara contenidos y no referencias.
El comparador == compara los punteros, no el contenido.
Salut,
Paposo
Paposo
Abundando en lo que dice Paposo, esto es lo que dice la JLS (Java Language Specification) en su punto 15.21.3 - Reference Equality Operators == and !=:
While == may be used to compare references of type String, such an equality test determines whether or not the two operands refer to the same String object. The result is false if the operands are distinct String objects, even if they contain the same sequence of characters (§3.10.5). The contents of two strings s and t can be tested for equality by the method invocation s.equals(t).
rickiees

Buenos días.
Estoy comenzando con Java aunque provengo de otros lenguajes y este es una simple prueba donde quiere que cuando pulse un boton se cambia alternativamente de texto.
Y, el caso es que no consigo que funcione. El código, muy sencillo, es este:
-----------
package com.guiVentana;
import java.awt.BorderLayout;
public class Ventana extends JFrame {
private JPanel contentPane;
private JTextField txtTexto;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Ventana frame = new Ventana();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public Ventana() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(new GridLayout(3, 3, 10, 10));
JButton btnCambiar = new JButton("Cambiar");
btnCambiar.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
CambiaTexto();
}
});
contentPane.add(btnCambiar);
txtTexto = new JTextField();
txtTexto.setHorizontalAlignment(SwingConstants.CENTER);
txtTexto.setText("Texto");
contentPane.add(txtTexto);
txtTexto.setColumns(10);
JButton btnNewButton = new JButton("Salir");
btnNewButton.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
System.exit(DISPOSE_ON_CLOSE);
}
});
contentPane.add(btnNewButton);
}
private void CambiaTexto(){
// ------
String texto = txtTexto.getText();
if (texto == "Nuevo Texto" ) txtTexto.setText("Nuevo Texto 2");
else txtTexto.setText("Nuevo Texto");
// -------siempre sale como falso why???????
System.out.println("Salida: " + texto + " / " + txtTexto.getText() );
}
}
------------
¿que diablos hago mal para el if siempre salga como falso ?
Muchas gracias.