Events com JavaFX e FXML

Olá pessoal,

Sei que a galera aqui não é especializada em JavaFX, mas espero que possam me ajudar. O meu projeto e conhecimento só favoreceram o uso dessa tecnologia, para a criação de uma interface mais rica e agora estou tendo alguma dúvidas de como programá-la. Os principais eventos em que quero ajuda são on Mouse Clicked e on Key Pressed. Vou mandar o controller que está ligado ao meu FXML e a minha classe Main.java. Há um exemplo de event padrão no click de um botão no código.

import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;
import javafx.scene.image.ImageView;
import javafx.scene.layout.StackPane;

public class tvdiController implements Initializable {
    
    @FXML
    private StackPane PRINCIPAL, PLACAR;
    
    @FXML
    private ImageView torcidaa;
   
    @FXML
    private void handleButtonAction(ActionEvent event) {
        System.out.println("You clicked me!");
    }
    
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        // TODO
    }    
}

Quero que ao clicar no botão Q do teclado ou clicar em cima da imagem de fx:id torcidaa, o StackPane de fx:id PRINCIPAL seja setado como visível.

Obrigado desde já pelo apoio,
Vitor Ramalho.

Olá,

Por que você não adiciona o listener para a imagem no código do Controller???

ImageView é um node, nodes podem receber todos os eventos que estão aqui na documentation:

http://docs.oracle.com/javafx/2/api/javafx/scene/Node.html

Agradeço pela resposta, mas ainda não consegui implementar os listeners no meu programa.

Nenhum evento parece funcionar no meu programa.

    @FXML
    protected void teste(MouseEvent event) {
       PRINCIPAL.setVisible(true); 
    }

Defini uma action onMouseClicked ao teste, como mostrado aqui (http://www.e-zest.net/blog/javafx-2-x-development-using-fxml/), e mesmo assim, ao executar o problema, só recebo erros na linha da action…

Ago 16, 2012 9:51:18 PM javafx.fxml.FXMLLoader logException
Grave: The following error occurred at line 191 in file file:/C:/Users/Vitor%20Ramalho/Desktop/UFRN/Programação/F4TVDI/dist/F4TVDI.jar!/tvdi.fxml[Ljava.lang.StackTraceElement;@2c12625d
Exception in Application start method
java.lang.reflect.InvocationTargetException
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:601)
	at com.javafx.main.Main.launchApp(Main.java:453)
	at com.javafx.main.Main.main(Main.java:537)
Caused by: java.lang.RuntimeException: Exception in Application start method
	at com.sun.javafx.application.LauncherImpl.launchApplication1(Unknown Source)
	at com.sun.javafx.application.LauncherImpl.access$000(Unknown Source)
	at com.sun.javafx.application.LauncherImpl$1.run(Unknown Source)
	at java.lang.Thread.run(Thread.java:722)
Caused by: javafx.fxml.LoadException: Controller method "aeteste" not found.
	at javafx.fxml.FXMLLoader$Element.processEventHandlerAttributes(Unknown Source)
	at javafx.fxml.FXMLLoader$ValueElement.processEndElement(Unknown Source)
	at javafx.fxml.FXMLLoader.processEndElement(Unknown Source)
	at javafx.fxml.FXMLLoader.load(Unknown Source)
	at javafx.fxml.FXMLLoader.load(Unknown Source)
	at javafx.fxml.FXMLLoader.load(Unknown Source)
	at javafx.fxml.FXMLLoader.load(Unknown Source)
	at Main.start(Main.java:15)
	at com.sun.javafx.application.LauncherImpl$5.run(Unknown Source)
	at com.sun.javafx.application.PlatformImpl$4.run(Unknown Source)
	at com.sun.javafx.application.PlatformImpl$3.run(Unknown Source)
	at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
	at com.sun.glass.ui.win.WinApplication.access$100(Unknown Source)
	at com.sun.glass.ui.win.WinApplication$2$1.run(Unknown Source)
	... 1 more
Java Result: 1

"Caused by: javafx.fxml.LoadException: Controller method “aeteste” not found. "

Não está achando o controller. como você definiu ele no FXML?

<AnchorPane id="AnchorPane" fx:id="TVDI" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" prefHeight="720.0" prefWidth="1250.0" xmlns:fx="http://javafx.com/fxml" fx:controller="tvdiController">

Tenho que botar a extensão do arquivo?

O nome tá correto e nos exemplos que vi não tinham o .java.

Pelo que eu entendi, o FXML que busca pela action no controller e não acha nada, estou certo?
Como faço para resolver isso? A minha utilização de eventos está sendo feita de forma correta?

Obrigado pela ajuda.

Você tem que usar o “fully qualified name” da classe: “tvdiController”.

Também está minúsculo o nome da classe, é minúsculo mesmo?

O controller é realmente o tvdiController.java, então acho que tá certo…

Meu event está sendo tratado desta forma:

@FXML
private void aeteste(MouseEvent event) {
     PRINCIPAL.setVisible(true);
}

E no FXML definido, dentro da marcação do node, como:

onMouseClicked="#aeteste"

Recomendo Iniciar o nome da classe com letra maiúscula.

public class TvdiController implements Initializable {

}

Outra coisa. Se estiver dentro de um pacote, xxx, informar : xxx.TvdiController

caro amigo, tambem estou me matando com o javafx
e ja passei por este problema

no scene builder vc tem la em code
os eventos que vc precisa

porem ao declarar o nome do evento
ao desenhar no scene builder
vc deve por o nome do evento com o jogo da velha:

exemplo

evento “BotaoClicado”

no scene builder vc tem que preencher

da seguinte maneira:

#BotaoClicado

e na sua classe que vai tratar a tecla

vc vai referenciar ao evento da seguinte maneira:

@FXML
public void BotaoClicado(ActionEvent event) {
… … …
}

espero ter ajudado…

@Zeovaldo
Já fiz essa modificação, mas o grande problema ainda continua…
Acho que é o modo como tratei o evento que está errado, mas já li a documentação e ainda não sei como trabalhar eles.

@jonasjgs2
Já defini isso no meu FXML lá no SceneBuilder, mas o grande problema é que mesmo com o nome certo e associado ao meu arquivo, ele diz que não há um método correspondente no meu Controller.

vitinho995,

Já resolveu seu problema?

@tedwagner1975

Não tive tempo para concluir o meu projeto e abandonei essa implementação, mas ainda tenho curiosidade na área.