Java: El uso de un ActionListener para llamar a una función en otra clase en un objeto de esa clase

StackOverflow https://stackoverflow.com/questions/1346978

Pregunta

Básicamente lo que quiero hacer es conseguir un botón de inicio para iniciar un método que se ejecuta en otra clase y que actúa sobre otro objeto.

Mi código para el oyente:

button1a.addActionListener(new ActionListener() {
    public void actionPerformed (ActionEvent event) {
        // Figure out how to make this work
        //sim.runCastleCrash(); 
    }
} );

Mi código para la otra clase:

public static void main(String[] args) {
    CastleCrash sim;
    sim = new CastleCrash();
}

y

public void runCastleCrash() {
    System.out.println("Castle Crash is beginning...");
    //Other method parts here to be added
}

Me da la sensación de que esto no puede ser demasiado duro, pero me falta una pieza.

¿Fue útil?

Solución

Una forma de hacer referencia a las cosas de una clase anónima está utilizando la palabra clave final:

  public static void main(String[] args) {
    final Object thingIWantToUse = "Hello";

    JButton button = new JButton("Click");
    button.addActionListener(new ActionListener() {
      @Override public void actionPerformed(ActionEvent e) {
        System.out.println(thingIWantToUse);
      }
    });

    JFrame frame = new JFrame();
    frame.setLayout(new FlowLayout());
    frame.add(button);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    frame.setVisible(true);
  }

Como alternativa, puede acceder a los miembros (variables o métodos) de un tipo envolvente:

public class ActionListenerDemo2 {
  private final JFrame frame = new JFrame();
  private Object thingIWantToUse = "Hello";

  public ActionListenerDemo2() {
    JButton button = new JButton("Click");
    button.addActionListener(new ActionListener() {
      @Override public void actionPerformed(ActionEvent e) {
        thingIWantToUse = "Goodbye";
        System.out.println(thingIWantToUse);
      }
    });
    frame.setLayout(new FlowLayout());
    frame.add(button);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    frame.setVisible(true);
  }

  public static void main(String[] args) {
    new ActionListenerDemo2().frame.setVisible(true);
  }
}

Otros consejos

He tenido el mismo problema que tú y así es como lo resolví.

Usted puede hacer que su último objeto (CastleCrash última sim = new CastleCrash ();), pero que no quería hacer eso, o se puede hacer algo así como un método de selección para ejecutar el método en su otra clase:

Mi código para la clase de escucha:

button1a.addActionListener(new ActionListener()
{

    public void actionPerformed (ActionEvent event)
    {
    //How to make this work ?
    //Like this:
    runCC();
    }
});

public void runCC()
{
    CastleCrash sim = new CastleCrash();
    sim.runCastleCrash();
}

Mi código para la otra clase:

public void runCastleCrash()
{   
    System.out.println("Castle Crash is beginning...");
    //Other method parts here to be added
}

Espero que esto es útil, buena suerte! :)

McDowell ya responde prácticamente con buenos ejemplos de cómo acceder a las variables de los detectores de eventos (o clases internas anónimas en general). No obstante un recurso más general de Sun en detectores de eventos de oscilación que es canónica y una buena visión general de todas las advertencias que deben tenerse en cuenta a la hora de escribirlas.

De alguna manera lo que necesita una referencia a su objeto CastleCrash disponible para llamar desde su actionListener.

Es posible que desee subclase de JFrame, o lo que se contiene su JButton tal que tiene su tanto su principal método y una propiedad CastleCrash que luego puede ser referenciado desde su actionListener clase interna anónima.

PERO - tenga cuidado, que parece que te está llamando lo que será un método de larga ejecución desde el interior del hilo de eventos interfaz gráfica de usuario (donde se llama el oyente de action). Esto es generalmente una mala idea, se le caso de que su interfaz gráfica de usuario deje de responder.

http://java.sun.com/ productos / JFC / TSC / artículos / hilos / threads1.html especialmente el bit de clase SwingWorker para obtener ideas sobre cómo evitar ese problema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top