Pergunta

Basicamente o que eu quero fazer é começar botão para iniciar um método de execução em outra classe e de agir sobre outro objeto.

O meu código para que o ouvinte:

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

Meu código para a 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
}

Tenho a sensação que isso não pode ser muito duro, mas eu estou faltando um pedaço.

Foi útil?

Solução

Uma maneira de fazer referência a coisas em anônimo classe está usando o final palavras-chave:

  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, você pode acessar os membros (variáveis ou métodos) de um delimitador tipo:

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

Outras dicas

Eu tive o mesmo problema como você e foi assim que eu resolvi.

Você pode chegar ao seu objeto final (Final Castlecrash Sim = new Castlecrash ();), mas eu não queria fazer isso, ou você pode fazer algo como um método Setter para executar o método em sua outra classe:

Meu código para a classe do ouvinte:

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

Meu código para a outra classe:

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

Espero que isso seja útil, boa sorte! :)

McDowell já responde a praticamente com bons exemplos sobre como acessar variáveis de ouvintes de evento (ou classes internas anônimas em geral).Há, no entanto, de uma forma mais geral de Sol recurso de Ouvintes de Eventos em andamento que é canônico e uma boa visão geral de todos os cuidados a ter em conta ao escrever-lhes.

De alguma forma, você precisa de uma referência ao seu objeto CastleCrash disponível para ligar do seu ActionListener.

Você provavelmente deseja subclasse JFrame, ou o que quer que esteja contendo seu jbutão, de modo que ele tenha o seu método principal e uma propriedade Castlecrash que pode ser referenciada do seu listener de ação de classe interna anônimo.

Mas - tenha cuidado, parece que você está chamando o que será um método de longa duração do tópico do evento da GUI (onde o ouvinte de ação será chamado). Geralmente, é uma má idéia, você caso sua GUI se tornar sem resposta.

Ver http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html Especialmente a parte da aula de swingworker para obter idéias sobre como evitar esse problema.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top