• Viernes 17 de Mayo de 2024, 07:29

Autor Tema:  Duda Con Swing  (Leído 2698 veces)

escape

  • Nuevo Miembro
  • *
  • Mensajes: 16
    • Ver Perfil
Duda Con Swing
« en: Viernes 8 de Diciembre de 2006, 22:13 »
0
hola, tengo una aplicación realizada en swing. De la siguiente forma:


Código: Text
  1. public class Aplicacion extends JFrame
  2. {
  3.      private JButton a;
  4.      private JButton b;
  5.  
  6.      public static void main(String[] args)
  7.     {
  8.           new Aplicacion();
  9.     }
  10.  
  11.     public Aplicacion()
  12.     {
  13.          // aqui todo el codigo del constructor
  14.          // que genera la interfaz.
  15.          // Con estos botones tengo problema:
  16.        
  17.          Interna o = new Interna();
  18.  
  19.          a = new JButton("jugar");
  20.          a.addActionListener(o);
  21.        
  22.          b = new JButton("resultado");
  23.          b.addActionListener(o);
  24.       }
  25.  
  26.      // a continuacion una clase interna que
  27.     // maneja los eventos
  28.  
  29.    private class Interna implements ActionListener
  30.    {
  31.  
  32.         public void actionPerformed(ActionEvent e)
  33.         {
  34.              
  35.              if(e.getSource() == a)
  36.              {
  37.                       // se hace algo
  38.              }
  39.  
  40.              if(e.getSource() == b)
  41.              {
  42.                    // este codigo jamás lo ejecuta
  43.                   // es como si no existiera
  44.                   // ¿por qué?
  45.               }
  46. }
  47. }
  48.  
   

La situación es que el "botón b" a pesar de tener registrado un listener no gatilla ninguna acción. Sin embargo, si cambio
    if(b.getSource() == "b") por un simple "else", el boton b si gatilla la acción...¿por qué?. Gracias.

escape

  • Nuevo Miembro
  • *
  • Mensajes: 16
    • Ver Perfil
Re: Duda Con Swing
« Respuesta #1 en: Sábado 9 de Diciembre de 2006, 07:25 »
0
como nadie va a tener una sugerencia????

su -

  • Moderador
  • ******
  • Mensajes: 2349
    • Ver Perfil
Re: Duda Con Swing
« Respuesta #2 en: Domingo 10 de Diciembre de 2006, 15:45 »
0
No se de Java, pero normalmente == se usa para comparar numeros, intenta usar eq:
http://java.sun.com/j2se/1.5.0/docs/api/ja...ment/Query.html

Si no es asi... ni idea.
*******PELIGRO LEE ESTO!!*******

There is no place like 127.0.0.1

Conecto luego existo, no conecto luego insisto.

silverfox

  • Miembro MUY activo
  • ***
  • Mensajes: 280
    • Ver Perfil
Re: Duda Con Swing
« Respuesta #3 en: Lunes 11 de Diciembre de 2006, 11:38 »
0
Hola...

Completamente cierto, su...

Para comparar dos objetos, necesitas usar Object.equals().

Mira si te funciona con eso.


Un saludo.



Silverfox

escape

  • Nuevo Miembro
  • *
  • Mensajes: 16
    • Ver Perfil
Re: Duda Con Swing
« Respuesta #4 en: Martes 12 de Diciembre de 2006, 05:58 »
0
a pesar de ser cierto que el operador == no se utiliza para comparar instancias, esto es efectivo siempre y cuando se desee comparar el contenido de los objetos. De todas formas, el problema no pasaba por eso, sino que por un error mio al codificar dos variables con el mismo nombre, una en la clase externa y la otra dentro de la interna. Gracias.

silverfox

  • Miembro MUY activo
  • ***
  • Mensajes: 280
    • Ver Perfil
Re: Duda Con Swing
« Respuesta #5 en: Martes 12 de Diciembre de 2006, 11:35 »
0
Citar
a pesar de ser cierto que el operador == no se utiliza para comparar instancias, esto es efectivo siempre y cuando se desee comparar el contenido de los objetos.

Este código demuestra que te equivocas completamente:

Código: Text
  1.  
  2. public class Test_Java2 {
  3.  
  4.   int a;
  5.  
  6.   Test_Java2(int i){
  7.     this.a= i;
  8.   }
  9.  
  10.   public static void main (String args[]){
  11.     String aa= new String("test");
  12.     if(aa == "test"){
  13.       System.out.println(aa + " == \"test\"");
  14.     }else{
  15.       System.out.println(aa + " != \"test\"");
  16.     }
  17.  
  18.     if(aa.equals("test")){
  19.       System.out.println(aa + ".equals(\"test\") == true");
  20.     }else{
  21.       System.out.println(aa + ".equals(\"test\") == false");
  22.     }
  23.     Test_Java2 t1= new Test_Java2(1);
  24.     Test_Java2 t2= new Test_Java2(1);
  25.    
  26.     System.out.println(t1 == t2);      
  27.   }
  28.  
  29.    class Clase {
  30.     int a;
  31.    
  32.     public Clase(int i){
  33.       this.a=i;
  34.     }
  35.   }
  36. }
  37.  

El operador == compara la posición en memoria de los objetos, mientras que equals() compara cada clase de la forma implementada por ella misma (ya que casi todas las clases sobreescriben éste método, generalmente, haciendo comparaciones campo por campo (si son primitivas), o llamando a los equals correspondientes (si son otros objetos).


Extraído de: http://www.devx.com/tips/Tip/12843
Citar
The == operator returns true if the two handles on the left and right sides refer to the same location in memory. The function Object.equals() is intended to return true if two handles refer to logically equivalent instances.


Extraído de: http://java.sun.com/mailers/techtips/corej...006/tt0822.html

Citar
Comparing with the == Operator

The == operator works on String object references. If two String variables point to the same object in memory, the comparison returns a true result. Otherwise, the comparison returns false, regardless whether the text has the same character values. The == operator does not compare actual char data. Without this clarification, you might be surprised that the following code snippet prints The strings are unequal.

String name1 = "Michèle";
String name2 = new String("Michèle");
if (name1 == name2) {
  System.out.println("The strings are equal.");
} else {
  System.out.println("The strings are unequal.");
}
      The Java platform creates an internal pool for string literals and constants. String literals and constants that have the exact same char values and length will exist exactly once in the pool. Comparisons of String literals and constants with the same char values will always be equal.

Comparing with the equals Method
The equals method compares the actual char content of two strings. This method returns true when two String objects hold char data with the same values. This code sample prints The strings are equal.

String name1 = "Michèle";
String name2 = new String("Michèle");
if (name1.equals(name2) {
  System.out.println("The strings are equal.");
} else {
  System.out.println("The strings are unequal.");
}


De todas formas, te funcionará bien, ya que en el fondo, estás comparando dos objetos idénticos, por ser ambos la misma referencia a memoria.


Un saludo.




Silverfox

escape

  • Nuevo Miembro
  • *
  • Mensajes: 16
    • Ver Perfil
Re: Duda Con Swing
« Respuesta #6 en: Jueves 14 de Diciembre de 2006, 06:43 »
0
silverFox, equals compara objetos. Por ejemplo, si usas un if == , dentro de un listener en swing, sirve. El equals devuelve un boolean, para comprobar si hablas de dos objetos iguales. Si quieres comparar los atributos del objeto, usas los 5 metodos de la API que sobreescriben al método. Sin embargo, un boton llamado "aceptar" es unico, asi lo declaras, no puedes tener dos botones en una misma clase llamados"aceptar". Ahora, si quieres comparar los atributos de un objeto que contenga campos tipo: nombre, edad, fecha, etc... logicamente el if no sirve, porque apunta a una dirección de memoria, la cual seria distinta a pesar que el objeto tenga los mismos campos.


Buena discusión. Es agradable este foro. Saludos.  :D

silverfox

  • Miembro MUY activo
  • ***
  • Mensajes: 280
    • Ver Perfil
Re: Duda Con Swing
« Respuesta #7 en: Jueves 14 de Diciembre de 2006, 15:36 »
0
Hola...

Citar
Sin embargo, un boton llamado "aceptar" es unico, asi lo declaras, no puedes tener dos botones en una misma clase llamados"aceptar".

¿Y qué? Lo que cuenta no es el nombre de la variable, sino la dirección de memoria a la que apunta. Naturalmente, no puedes hacer que una variable apunte a dos sitios distintos a la vez, pero sí que puedes tener dos variables apuntando al mismo sitio. Cuando tu Event hace referencia al objeto emisor, utiliza una referencia a memoria, no el nombre de la variable... Por eso funciona, en realidad, estás comparando dos direcciones de memoria, que da la casualidad de que son iguales y por eso te dí la razón.

A lo mejor es que no entendí tu primer razonamiento.

Citar
El equals devuelve un boolean, para comprobar si hablas de dos objetos iguales.

¿Qué quieres decir con iguales? Es que, lamentablemente, si haces algo como:
Código: Text
  1. JButton a= new JButton();
  2. JButton b= a;
  3.  

a y b no es que sean iguales, sino que apuntan al mismo sitio -> son el mismo objeto.


Citar
logicamente el if no sirve, porque apunta a una dirección de memoria, la cual seria distinta a pesar que el objeto tenga los mismos campos.

Lamentablemente, y en el caso del JButton en particular, entre muchos otros, un equals tampoco serviría para comprobar la igualdad entre los campos ;) Ejecuta esto, para comprobarlo:

Citar
JButton a= new JButton("boton");
JButton b= new JButton("boton");
System.out.println((a==b )+"  "+a.equals(b ));


Por cierto, sí que puedes tener varias variables que se llamen igual, con distintos ámbitos. ;) (aunque no como variables de clase ambas, claro) ;)


Un saludo.



Silverfox

escape

  • Nuevo Miembro
  • *
  • Mensajes: 16
    • Ver Perfil
Re: Duda Con Swing
« Respuesta #8 en: Jueves 14 de Diciembre de 2006, 20:12 »
0
Hola.

Por parte. El nombre de la variable si que importa. A el efecto de declarar variables con el mismo nombre se le conoce como Shadowing. Por ejemplo:

Código: Text
  1.  
  2.  
  3.      public class Shadowing
  4.      {
  5.            
  6.                 private int x;
  7.  
  8.                 public static void main(String[] args)
  9.                 {
  10.                        
  11.                            x = 6
  12.                            
  13.                            int x&#59;// variable repetida
  14.                            x = 5; // no existe error
  15.                            System.out.println("x = " +x);
  16.                  }
  17.       }
  18.  
  19.  

Si te fijas existen dos vatiables "x". Al mostrar por consola, se muestra x = 5, no x = 6. Esto se debe a un efecto de "ensombrecer" la variable de la clase. La variable que se utiliza es la definida dentro del ambiente más cercano. Apliquemos eso a lo que sucedia en mi aplicación:

Código: Text
  1.  
  2.  
  3.     public class Interfaz extends JFrame
  4.     {
  5.    
  6.            private JButton resultado;
  7.  
  8.            public Interfaz()
  9.           {
  10.  
  11.               resultado = new JButton("Resultado");
  12.               resultado.addActionListener(new Eventos());
  13.            }
  14.  
  15.        
  16.           private class Eventos implements ActionListener
  17.           {
  18.  
  19.                   private LinkedList<String> resultado;
  20.  
  21.                   public Eventos()
  22.                   {
  23.  
  24.                         resultado = new LinkedList<String> ();
  25.                   }
  26.  
  27.  
  28.                  public void actionPerformed(ActionEvent e)
  29.                  {
  30.  
  31.                        if(e.getSource() == resultado)
  32.                        {
  33.                                // hacer algo
  34.                        }
  35.                   }
  36.         }
  37. }
  38.  
  39.  
     


En el código anterior, declaré por error dos variables con el mismo nombre:"resultado". Una es un botón y la otra una colección. El problema es que la colección es quien actúa en el metodo actionPerformed, no el botón. ¿Por qué?, simplemente por Shadowing de la variable. Si cambias el nombre del LinkedList a otro distinto, el programa funciona perfectamente.

Lo de equals lo comprendo, sé que compara referencias en la memoria. El método e.getSource() entrega la fuente del evento y se compara con el componente que gatilló la acción. Estrictamente hablando, e.getSource() no reconoce que componente se ha presionado en la interfaz, no sabe si es un botón, un combobox, etc. Si deseas acotar entonces además del equals, debes usar un cast:

Código: Text
  1.  
  2.  
  3.  public void actionPerformed(ActionEvent e)
  4.  {
  5.    
  6.       JButton boton = (JButton)e.getSource();
  7.  
  8.      if(boton.equals(boton1))
  9.      {
  10.  
  11.        // hacer algo
  12.      }
  13.  
  14.  
  15.     if(boton.equals(boton2))
  16.    {
  17.  
  18.     // hacer algo
  19.     }
  20. }
  21.  
  22.  


Ahora, parece que no me explique bien con respecto a comparar contenido y no referencias. Mira este ejemplo:

Código: Text
  1.  
  2.  
  3.   public class A
  4.   {
  5.  
  6.      private String nombre;
  7.      private String apellido;
  8.  
  9.      public A()
  10.      {
  11.  
  12.          nombre = new String();
  13.          apellido = new String();
  14.      }
  15.  
  16.     public A(String nombre, String apellido)
  17.     {
  18.  
  19.         this();
  20.         this.nombre = nombre;
  21.         this.apellido = apellido;
  22.     }
  23.  
  24. }
  25.  
  26.  
  27.  
  28.     public class B
  29.     {
  30.  
  31.           public static void main(String[] args)
  32.           {
  33.                  A a1 = new A("Miguel", "Andrade");
  34.                  A a2 = new A("Miguel", "Andrade");
  35.  
  36.                  // ambos objetos tienen los mismos campos
  37.                  // pero apuntan a sectores distintos de memoria
  38.  
  39.                 if(a1.equals(a2))
  40.                 {
  41.                      System.out.println("iguales");
  42.                  }
  43.                  else
  44.                  {
  45.                      System.out.println("distintos");
  46.                  }
  47.             }
  48.        }
  49.  
  50.  
  51.  

El código de arriba siempre mostrara "distintos" a pesar de que los objetos poseen el mismo nombre y apellido. En ese caso, sobreescribir equals presenta la utilidad, ya que compara el contenido de los objetos.

silverfox

  • Miembro MUY activo
  • ***
  • Mensajes: 280
    • Ver Perfil
Re: Duda Con Swing
« Respuesta #9 en: Viernes 15 de Diciembre de 2006, 09:05 »
0
Hola...

Vamos a ver...

Citar
Código: Text
  1.     public class Shadowing
  2.     {
  3.            
  4.                private int x;
  5.  
  6.                public static void main(String[] args)
  7.                {
  8.                        
  9.                           x = 6
  10.                          
  11.                           int x;// variable repetida
  12.                           x = 5; // no existe error
  13.                           System.out.println("x = " +x);
  14.                 }
  15.      }
  16.  

Tu código no está enmascarando nada, supongo que lo habrás escrito de memoria. De hecho, tiene un error por el que no puede ni siquiera ser compilado. (Supongo que lo habrás escrito de memoria, pero la variable Shadowing.x no existe en el main y, de existir, ni siquiera se tendría acceso a ella, porque la definiste como privada. Cuestión de visibilidad).

Pero bueno, se ve bastante bien el ejemplo de enmascaramiento que querías mostrar.

Ciertamente, en tu aplicación existe ese efecto colateral (porque no es un error, en realidad, todo está bien). Por cierto... ¿para qué comparas en el evento con la fuente del mismo? ¿No es más fácil añadir un ActionListener a cada botón por separado, o es que se requiere lo que estás haciendo aquí?


Citar
Código: Text
  1.  public class A
  2.  {
  3.  
  4.     private String nombre;
  5.     private String apellido;
  6.  
  7.     public A()
  8.     {
  9.  
  10.         nombre = new String();
  11.         apellido = new String();
  12.     }
  13.  
  14.    public A(String nombre, String apellido)
  15.    {
  16.  
  17.        this();
  18.        this.nombre = nombre;
  19.        this.apellido = apellido;
  20.    }
  21.  
  22. }
  23.  

Aquí estás generando 2 veces las variables de String... new String() genera una cadena vacía, y luego la estás sustituyendo por una constante, en el constructor con parámetros.
Naturalmente, son 2 objetos que tienen localizaciones de memoria diferentes, pero no veo en qué se diferencia este código de uno mío un poco más arriba en esta misma discusión.


Citar
Lo de equals lo comprendo, sé que compara referencias en la memoria.
No entendiste del todo:

Como todos habreis podido observar, el == siempre compara referencias en memoria de las variables, lo que significa que a==b significa, no que a y b sean dos objetos iguales, sino que son el mismo (como ya dije antes).

Por contra, el método equals() funciona de forma un poco diferente:
Object.equals(), JButton.equals() y otros, sí comparan referencias a memoria, porque es el comportamiento por defecto de equals(). Sin embargo, otras (como String, Integer y otras), comparan contenidos.
Por si a alguien le interesa saber cuáles sí y cuales no, echad un vistazo al interfaz Comparable. Lo habitual es que, si una clase implementa este interfaz, también tenga sobreescrito el método equals, según las especificaciones del API de Java (1.4.2 y 1.5.0, según he comprobado)



Un saludo.




Silverfox

Drackzer

  • Miembro activo
  • **
  • Mensajes: 40
  • Nacionalidad: mx
    • Ver Perfil
Re: Duda Con Swing
« Respuesta #10 en: Domingo 17 de Diciembre de 2006, 17:03 »
0
Hola..!!

Concuerdo con el amigo Silverfox, pero a la vez contigo tambine, te diras por que??

Bueno, por el hecho de que si es posible utilizar el operador == para hacer este tipo de comparaciones, pero aqui el error es que, creo que esta en la clase donde implementaste el ActionListener, el metodo "Interno"...

Porque al manejar la variable "o" para los dos, es como si solo compararan una misma accion por igual, y si se ejecuto una vez en un objeto, no puede ser vovler ejecutado por otro el mismo objeto... No se si sea correcta mi hipotesis, pero asi lo capto yo.

Porque no pruebas con el "this" como argumento en vez de la variable "o", y veras que ahora si podras usar los dos "if" que quieres implementar para declarar dos acciones difrerentes.

Ojala y te sirva de ayuda, Saludos..!!

Código: Text
  1.  
  2. // ***Programa que cambia los factores de formato de un boton
  3. // ***por medio de eventos
  4.  
  5. import java.awt.*;
  6. import javax.swing.*;
  7. import java.awt.event.*;
  8.  
  9. public class BotonDemo implements ActionListener
  10. {
  11.   JButton b1,b2,b3,b4,b5,b6;
  12.   JFrame marco;
  13.  
  14.   public BotonDemo()
  15.   {
  16.     marco=new JFrame("Prog.Botones");
  17.     marco.getContentPane().setLayout(new GridLayout(2,3,5,5));
  18.     // ** Aqui esta lo que te decia
  19.     // ** utilizar el this para instanciarle
  20.     // ** el evento, uno diferente
  21.     // ** para cada uno
  22.     b1=new JButton();
  23.     b1.addActionListener(this);
  24.     marco.getContentPane().add(b1);
  25.     b2=new JButton();
  26.     b2.addActionListener(this);
  27.     marco.getContentPane().add(b2);
  28.     b3=new JButton();
  29.     b3.addActionListener(this);
  30.     marco.getContentPane().add(b3);
  31.     b4=new JButton();
  32.     b4.addActionListener(this);
  33.     marco.getContentPane().add(b4);
  34.     b5=new JButton();
  35.     b5.addActionListener(this);
  36.     marco.getContentPane().add(b5);
  37.     b6=new JButton();
  38.     b6.addActionListener(this);
  39.     marco.getContentPane().add(b6);
  40.    
  41.     marco.setSize(500,150);
  42.     marco.setVisible(true);
  43.     marco.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  44.    
  45.   }
  46.   // ** Y aqui se ejecutna tales eventos....
  47.   public void actionPerformed(ActionEvent ev)
  48.   {
  49.     if(ev.getSource()==b1)
  50.     {
  51.       b1.setBackground(Color.lightGray);
  52.       b1.setForeground(Color.white);
  53.       b1.setText("Botoncito uno");
  54.       b1.setBorder(BorderFactory.createTitledBorder("Marco del boton uno"));
  55.     }
  56.     if(ev.getSource()==b2)
  57.     {
  58.       b2.setBackground(Color.yellow);
  59.       b2.setForeground(Color.green);
  60.       b2.setText("Botoncito dos");
  61.       b2.setBorder(BorderFactory.createTitledBorder("Marco del boton dos"));
  62.     }
  63.     if(ev.getSource()==b3)
  64.     {
  65.       b3.setBackground(Color.red);
  66.       b3.setForeground(Color.white);
  67.       b3.setText("Botoncito tres");
  68.       b3.setBorder(BorderFactory.createTitledBorder("Marco del boton tres"));
  69.     }
  70.     if(ev.getSource()==b4)
  71.     {
  72.       b4.setBackground(Color.white);
  73.       b4.setForeground(Color.black);
  74.       b4.setText("Botoncito cuatro");
  75.       b4.setBorder(BorderFactory.createTitledBorder("Marco del boton cuatro"));
  76.     }
  77.     if(ev.getSource()==b5)
  78.     {
  79.       b5.setBackground(Color.orange);
  80.       b5.setForeground(Color.blue);
  81.       b5.setText("Botoncito cinco");
  82.       b5.setBorder(BorderFactory.createTitledBorder("Marco del boton cinco"));
  83.     }
  84.     if(ev.getSource()==b6)
  85.     {
  86.       b6.setBackground(Color.blue);
  87.       b6.setForeground(Color.white);
  88.       b6.setText("Botoncito seis");
  89.       b6.setBorder(BorderFactory.createTitledBorder("Marco del boton seis"));
  90.     }
  91.    
  92.   }
  93.  
  94.   public static void main(String args[])
  95.   {
  96.     BotonDemo obj=new BotonDemo();
  97.    
  98.   }
  99. }
  100.  
  101.  

Espero te sirva carnal..!!
INGENIERIA EN SISTEMAS - Prox. Sitio Web
"BETTA GLOBAL SYSTEMS"