Livro JavaFX(Bruno Oliveira) Help tela Login

Galera, boa tarde!
Solicito um help, estou estudando o Livro do Bruno Oliveira - “JavaFX - Interfaces com qualidade para aplicações desktop” e bateu um erro de compilação que aparentemente é de Exception.

No exercicio teria que cria uma tela de Login e ao final ao compilar não executa, o código está exatamente como no livro. segue abaixo

import javax.swing.JOptionPane;
import org.w3c.dom.Node;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;

public class LoginApp extends Application{
	
	private AnchorPane pane;
	private TextField txLogin;
	private PasswordField txSenha;
	private Button btEntrar, btSair;
	private static Stage stage;

	@Override
	public void start(Stage stage) throws Exception{
		
		initComponents();
		initListeners();
		Scene scene = new Scene(pane);		
		stage.setScene(scene);
		//Remove a opção de maximizar a tela
		stage.setResizable(false);
		//Dá um título para a tela
		stage.setTitle("Login - GolFX");
		stage.show();
		initLayout();
		LoginApp.stage = stage;		
		
		
	}
	
	public static Stage getStage(){
		return stage;
	}
	
	public void initComponents(){
		
		pane = new AnchorPane();
		pane.setPrefSize(400, 300);
		pane.setStyle("-fx-background-color: linear-gradient(from 0% 0% to 100% 100%, blue 0%, silver 100%);");			
		txLogin = new TextField();
		txLogin.setPromptText("Digite aqui seu login");
		txSenha = new PasswordField();
		txSenha.setPromptText("Digite aqui sua senha");
		pane.getChildren().addAll(txLogin, txSenha, btEntrar, btSair);
	
		

	}
	
	public void initLayout(){
		//Largura dos componentes na tela
		txLogin.setLayoutX((pane.getWidth() - txLogin.getWidth()) / 2);
		txLogin.setLayoutY(50);
		txSenha.setLayoutX((pane.getWidth() - txLogin.getWidth()) / 2);
		txSenha.setLayoutY(100);
		btEntrar.setLayoutX((pane.getWidth() - txLogin.getWidth()) / 2);
		btEntrar.setLayoutY(150);
		btSair.setLayoutX((pane.getWidth() - txLogin.getWidth()) / 2);
		btSair.setLayoutY(200);
	}
	
	private void initListeners(){
		
		btSair.setOnAction(new EventHandler<ActionEvent>(){
			@Override
			public void handle(ActionEvent event){
				fecharAplicacao();
			}
		});
		
		btEntrar.setOnAction(new EventHandler<ActionEvent>(){
			@Override
			public void handle(ActionEvent event){
				logar();
			}
		});
	}
	
	private void fecharAplicacao(){
		System.exit(0);
	}
	
	private void logar(){
		if(txLogin.getText().equals("admin") && txSenha.getText().equals("casadocodigo")){
			//TODO abrir a tela VitrineApp
		} else{
			JOptionPane.showMessageDialog(null, "Login e/ou senha inválidos", "Erro", JOptionPane.ERROR_MESSAGE);
		}
	}

	
	
	
	public static void main(String[] args){
		launch(args);
	}
}

NullPointerException na linha onde está pane.getChildren().addAll(txLogin, txSenha, btEntrar, btSair);

Os botões são null.

Caused by: java.lang.NullPointerException: Children: child node is null: parent = AnchorPane@ec226b
	at javafx.scene.Parent$2.onProposedChange(Parent.java:435)
	at com.sun.javafx.collections.VetoableListDecorator.addAll(VetoableListDecorator.java:234)
	at com.sun.javafx.collections.VetoableListDecorator.addAll(VetoableListDecorator.java:103)
	at LoginApp.initComponents(LoginApp.java:53)
1 curtida

Cara muito Obrigado, olha que revisei o código diversas vezes, li o capitulo novamente pra ver se tinha esquecido alguma coisa. Aos poucos e apanhando apreendemos

btEntrar = new Button("Entrar");
btSair = new Button("Sair");

Obrigado