Duda muy basica sobre el paso de parametros

sportinguista
03 de Marzo del 2006
Hola a todos, dejadme q os ponga la situacion:

Tienes un int declarado en una clase, y quieres que en un momento dado salte un listener y modifique ese valor, pero no se como hacer que en el listener que recoje ese suceso, se le pase la variable int y le cambie el valor, para q al volver a la funcion principal, mantenga el nuevo valor.

Por ejemplo:
import javax.swing.*;

public class PruebaMain {

public static void main (String[] Args)
{
int valor=0;
JPanel P = new JPanel();
JFrame F = new JFrame();
JButton B = new JButton(\\\"Cambiar Valor\\\");
JButton B2 = new JButton(\\\"Imprime\\\");
P.add(B);
P.add(B2);
F.add(P);
F.setVisible(true);
F.pack();

B.addMouseListener(new Pulsar(valor));
B2.addMouseListener(new Imprimir(valor));

}

Listener 1:

import java.awt.event.*;

public class Pulsar extends MouseAdapter{

int valor;

public Pulsar(int valor)

{
this.valor=valor;
}

public void mouseClicked(MouseEvent E)
{
valor=valor + 10;
}
}

Listener 2:

import java.awt.event.*;

public class Imprimir extends MouseAdapter{
int valor;

public Imprimir(int valor)
{
this.valor=valor;
}
public void mouseClicked(MouseEvent E)
{
System.out.println(valor);
}
}


:-( q vergüenza, seguro q es superbasico, pero no me sale. Podeis ayudarme por favor?

chuidiang
03 de Marzo del 2006
Hola:

No puedes de una forma sencilla. No es posible pasar un int y que cambie de valor. La unica posibilidad es que los listeners vean directamente el int de la clase principal para cambiarlo.

Un mecanismo normal es hacer esto

public static void main (String [] args)
{
new PruebaMain();
}

PruebaMain debe tener como atributo el int valor, en vez de ser una variable local. Luego, en el constructor de PruebaMain, además de instanciar los botones, puedes hacer esto

JButton B = new JButton(\\\"Cambiar Valor\\\");
B.addActionListener(new ActionListener()
{
public void actionPerformed (ActionEvent e)
{
valor = valor+10;
}
}
);

Al hacer el ActionListener de esta forma en vez de como clase aparte, tiene acceso a los atributos de PruebaMain y en concreto a valor.

Se bueno

Diego
03 de Marzo del 2006
Utiliza la clasejava.util.concurrent.atomic.AtomicInteger, que permite tener una referencia a un entero modificable desde varios objetos garantizando además el acceso concurrente seguro. Espero que te sirva.