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.