Java: L'utilizzo di un ActionListener per chiamare una funzione in un'altra classe su un oggetto da quella classe

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

Domanda

Fondamentalmente quello che voglio fare è ottenere un pulsante di avvio per avviare un metodo di esecuzione in un'altra classe e di agire su un altro oggetto.

Il mio codice per l'ascoltatore:

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

Il mio codice per l'altra classe:

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

e

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

Ho la sensazione che questo non può essere troppo difficile, ma mi manca un pezzo.

È stato utile?

Soluzione

Un modo per fare riferimento a cose in una classe anonima sta usando la parola chiave 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);
  }

In alternativa, è possibile accedere ai membri (variabili o metodi) di un tipo di inclusione:

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);
  }
}

Altri suggerimenti

Ho avuto lo stesso problema come te e questo è come ho risolto.

È possibile rendere il vostro finale dell'oggetto (CastleCrash finale sim = new CastleCrash ();), ma non volevo farlo, o si può fare qualcosa di simile a un metodo setter per eseguire il metodo nella altra classe:

Il mio codice per la classe ascoltatore:

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();
}

Il mio codice per l'altra classe:

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

Spero che questo è utile, buona fortuna! :)

McDowell risponde già praticamente con buoni esempi su come accedere alle variabili da listener di eventi (o classi interne anonime in genere). V'è tuttavia una risorsa Sun più generale sui listener di eventi in Swing che è canonica e una buona panoramica di tutti gli avvertimenti di prendere in considerazione quando si scrive di loro.

In qualche modo è necessario un riferimento all'oggetto CastleCrash disposizione per chiamare dal tuo ActionListener.

Probabilmente si desidera sottoclasse JFrame, o tutto ciò che è contenente il JButton tale che ha il vostro sia il metodo principale e una proprietà CastleCrash che può essere poi applicata dal vostro anonimo ActionListener classe interna.

MA - attenzione, si guarda come si sta chiamando quello che sarà un metodo di lunga esecuzione dall'interno thread evento GUI (dove verrà chiamato l'ascoltatore azione). Questo è generalmente una cattiva idea, vi caso in cui il GUI per non rispondere.

http://java.sun.com/ prodotti / JFC / TSC / articoli / discussioni / threads1.html soprattutto il bit di classe SwingWorker per le idee su come evitare questo problema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top