Bom dia, como estou começando com JavaFX estou montando uma pequena aplicação para testar, no momento estou tentando ler o conteúdo de um campo textField mas tenho null pointer como retorno.
fiz a ligação do controller no fxml, criei o id e vinculei.
Erro:
Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1774)
at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1657)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
at javafx.event.Event.fireEvent(Event.java:198)
at javafx.scene.Node.fireEvent(Node.java:8411)
at javafx.scene.control.Button.fire(Button.java:185)
at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182)
at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96)
at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89)
at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
at javafx.event.Event.fireEvent(Event.java:198)
at javafx.scene.Scene$MouseHandler.process(Scene.java:3757)
at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485)
at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:352)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:275)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$354(GlassViewEventHandler.java:388)
at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:387)
at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
at com.sun.glass.ui.View.notifyMouse(View.java:937)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71)
at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275)
at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1771)
... 48 more
Caused by: java.lang.NullPointerException
at br.ind.risc.controller.Controller.validateFormB1(Controller.java:134)
at br.ind.risc.controller.Controller.searchQ1(Controller.java:115)
... 58 more
Fonte:
controller
package br.ind.risc.controller;
import java.awt.Dialog;
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
import java.util.Date;
import java.util.List;
import javax.print.attribute.standard.DateTimeAtCompleted;
import javax.print.attribute.standard.DialogTypeSelection;
import br.ind.risc.application.ReportMain;
import br.ind.risc.dao.DAOFactory;
import br.ind.risc.dao.TagsDAO;
import br.ind.risc.model.Tags;
import br.ind.risc.util.StringUtils;
import javafx.application.Platform;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.control.DatePicker;
import javafx.scene.control.RadioButton;
import javafx.scene.control.TextField;
import org.controlsfx.dialog.Dialogs;
public class Controller {
private ReportMain reportMain;
LocalDate dtIniDif;
LocalDate dtFimDif;
/**
* Quadro 1 Data/Tag
* 2 date picker; 1 combobox; 4 radio button
* 1 button
*/
@FXML
private DatePicker dtIni1;
@FXML
private DatePicker dtFim1;
@FXML
private ComboBox<String> cbTag1;
@FXML
private RadioButton pdf1;
@FXML
private RadioButton excel1;
@FXML
private RadioButton gBarra1;
@FXML
private RadioButton gLinha1;
@FXML
private Button btnGerar1;
@FXML
private TextField hourIni;
/**
* Dados tag
*/
private Tags currentTags;
/**
* Objeto DAO para manipulação de dados
*/
private TagsDAO dao;
/**
* Property que indica se os resultados da tabela estão filtrados
*/
private BooleanProperty resultsFiltered = new SimpleBooleanProperty();
/**
* Método chamado pelo JavaFX quando o controller é instanciado
*/
@FXML
private void initialize(){
//obtém o objeto DAO
//dao = DAOFactory.getTagsDAO();
//carrega os dados sem filtragem
loadData(false);
}
/**
* sair
*/
@FXML
public void exit(){
//Encerra a aplicação
Platform.exit();
}
/**
* Método chamando quando o usuário confirma a geração do relatório do bloco 1
*/
@FXML
public void onConfirmB1(){
}
/**
* Método chamando quando uma filtragem é realizada quadro 1
*/
@FXML
public void searchQ1(){
//valida se os dados estão ok
String errorMessage = validateFormB1();
if(!errorMessage.isEmpty()){
//Caso não estejam, mostra o erro de validação e retorna
showValidationError(errorMessage);
return;
}
//Carrega os dados com a filtragem habilitada
loadData(true);
//Define os dados como estando filtrados
resultsFiltered.set(true);
}
/**
* valida o formulário bloco1
*/
private String validateFormB1(){
StringBuilder errorMessage = new StringBuilder();
System.out.println(hourIni.getText());
//Verifica se a data foi preenchida
if(StringUtils.isEmpty(currentTags.getData().toString())){
errorMessage.append("Inserir a data").append(StringUtils.newLine());
}
return errorMessage.toString();
}
/**
* Exibe um erro de validação na tela
* @param message
*/
private void showValidationError(String message){
Alert alert = new Alert(AlertType.ERROR);
alert.setTitle("Erro de validação");
alert.setHeaderText("Dados incorretos");
alert.setContentText(message);
alert.showAndWait();
}
/**
* Carrega os dados na tela
* @para filter true se é preciso filtrar os dados; false, caso contrário
*/
private void loadData(boolean filter){
List<Tags> items = null;
if(!filter){
//items = dao.load();
}else{
//items = dao.filter(dt1, dt2, idTag)
}
//ObservableList<Tags> list = FXCollections.observableArrayList(items);
}
}
fxml:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.ComboBox?>
<?import javafx.scene.control.DatePicker?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.RadioButton?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.Pane?>
<AnchorPane maxHeight="700.0" maxWidth="897.0" minHeight="416.0" minWidth="500.0" prefHeight="512.0" prefWidth="776.0" styleClass="background" stylesheets="@css/RootTheme.css"
xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1" fx:controller="br.ind.risc.controller.Controller">
<children>
<Pane layoutX="15.0" layoutY="30.0" prefHeight="201.0" prefWidth="362.0" styleClass="pane" stylesheets="@css/RootTheme.css">
<children>
<Label layoutX="7.0" layoutY="-11.0" styleClass="label" stylesheets="@css/RootTheme.css" text="Data/Tag" textAlignment="CENTER" textOverrun="WORD_ELLIPSIS" />
<Label layoutX="14.0" layoutY="28.0" styleClass="label" stylesheets="@css/RootTheme.css" text="Data Inicial:">
<padding>
<Insets left="2.0" right="2.0" />
</padding>
</Label>
<Label layoutX="14.0" layoutY="59.0" styleClass="label" stylesheets="@css/RootTheme.css" text="Data Final:">
<padding>
<Insets left="2.0" right="2.0" />
</padding>
</Label>
<Label layoutX="14.0" layoutY="95.0" styleClass="label" stylesheets="@css/RootTheme.css" text="Tag:">
<padding>
<Insets left="2.0" right="2.0" />
</padding>
</Label>
<ComboBox layoutX="108.0" layoutY="93.0" prefHeight="25.0" prefWidth="239.0" />
<DatePicker layoutX="108.0" layoutY="57.0" />
<DatePicker layoutX="108.0" layoutY="26.0" />
<RadioButton layoutX="25.0" layoutY="134.0" mnemonicParsing="false" text="PDF" />
<RadioButton layoutX="77.0" layoutY="134.0" mnemonicParsing="false" text="Excel" />
<RadioButton layoutX="134.0" layoutY="134.0" mnemonicParsing="false" text="Gráfico(Barra)" />
<Button layoutX="121.0" layoutY="162.0" fx:id="btnGerar1" onAction="#searchQ1" mnemonicParsing="false" prefHeight="32.0" prefWidth="147.0" text="Gerar relatoriosdfsd" />
<RadioButton layoutX="238.0" layoutY="134.0" mnemonicParsing="false" text="Gráfico(Linha)" />
</children>
</Pane>
<Pane layoutX="397.0" layoutY="30.0" prefHeight="201.0" prefWidth="362.0" styleClass="pane" stylesheets="@css/RootTheme.css">
<Label layoutX="14" layoutY="-11.0" styleClass="label" stylesheets="@css/RootTheme.css" text="Data" textAlignment="CENTER" textOverrun="WORD_ELLIPSIS" />
<Label layoutX="12.0" layoutY="32.0" text="Data Inicial:" />
<Label layoutX="15.0" layoutY="69.0" text="Data Final:" />
<DatePicker layoutX="96.0" layoutY="30.0" />
<DatePicker layoutX="96.0" layoutY="67.0" />
<RadioButton layoutX="27.0" layoutY="121.0" mnemonicParsing="false" text="PDF" />
<RadioButton layoutX="79.0" layoutY="121.0" mnemonicParsing="false" text="Excel" />
<RadioButton layoutX="136.0" layoutY="121.0" mnemonicParsing="false" text="Gráfico(Barra)" />
<RadioButton layoutX="240.0" layoutY="121.0" mnemonicParsing="false" text="Gráfico(Linha)" />
<Button layoutX="121.0" layoutY="160.0" mnemonicParsing="false" prefHeight="32.0" prefWidth="147.0" text="Gerar relatorio" />
</Pane>
<Pane layoutX="14.0" layoutY="245.0" prefHeight="251.0" prefWidth="362.0" styleClass="pane" stylesheets="@css/RootTheme.css">
<Label layoutX="14" layoutY="-11.0" styleClass="label" stylesheets="@css/RootTheme.css" text="Data/Tag/Hora" textAlignment="CENTER" textOverrun="WORD_ELLIPSIS" />
<Label layoutX="14.0" layoutY="22.0" text="Data:" />
<Label layoutX="17.0" layoutY="59.0" text="Tag:" />
<Label layoutX="17.0" layoutY="91.0" text="Hora inicial:" />
<Label layoutX="14.0" layoutY="123.0" text="Hora final:" />
<DatePicker layoutX="106.0" layoutY="20.0" />
<ComboBox layoutX="106.0" layoutY="57.0" prefHeight="25.0" prefWidth="239.0" />
<TextField layoutX="107.0" layoutY="89.0" text="Hora Inicial" id="hourIni"/>
<TextField layoutX="107.0" layoutY="121.0" />
<RadioButton layoutX="12.0" layoutY="166.0" mnemonicParsing="false" text="PDF" />
<RadioButton layoutX="64.0" layoutY="166.0" mnemonicParsing="false" text="Excel" />
<RadioButton layoutX="121.0" layoutY="166.0" mnemonicParsing="false" text="Gráfico(Barra)" />
<RadioButton layoutX="225.0" layoutY="166.0" mnemonicParsing="false" text="Gráfico(Linha)" />
<Button layoutX="108.0" layoutY="205.0" mnemonicParsing="false" prefHeight="32.0" prefWidth="147.0" text="Gerar relatorio" />
</Pane>
<Pane layoutX="397.0" layoutY="245.0" prefHeight="251.0" prefWidth="362.0" styleClass="pane" stylesheets="@css/RootTheme.css">
<Label layoutX="14" layoutY="-11.0" styleClass="label" stylesheets="@css/RootTheme.css" text="Data/Hora" textAlignment="CENTER" textOverrun="WORD_ELLIPSIS" />
<Button layoutX="27.0" layoutY="30.0" mnemonicParsing="false" prefHeight="192.0" prefWidth="309.0" text="Gerar relatorio" />
</Pane>
</children>
</AnchorPane>
Grato pela ajuda