Jose Alberto Santiago Luna Jose Alberto Santiago Luna - 2 months ago 9
Java Question

How to Multiple setOnAction on the same button JavaFX

I'm trying to make the button jugar validates and returns value from a textbox and 3 drop boxes, there must be a way to validate more than one values, for example, the login button, when you type username and password.

here is the code

package application;

import javafx.scene.control.Button;
import javafx.scene.control.ChoiceBox;
import javafx.scene.control.TextField;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.StackPane;


public class Main extends Application implements EventHandler<ActionEvent>{

// crea los botones
Button historial;
Button jugar;

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

@Override
//nombre de la ventana principal
public void start(Stage primaryStage) throws Exception {
primaryStage.setTitle("Football Simulator 2016");


here the drop lists

//crea los drop list
ChoiceBox<String> jugadasArbitro = new ChoiceBox<>();
jugadasArbitro.getItems().addAll("Saque de banda","Tiro de esquina","Falta","Falta(Tarjeta amarilla)", "Falta (Tarjeta roja)", "Mano","Posicion adelantada","Penal","Fuera de juego", "Gol");
ChoiceBox<String> jugadasOfensivas = new ChoiceBox<>();
jugadasOfensivas.getItems().addAll("Pase","Pase largo","Tiro a puerta");
ChoiceBox<String> jugadasDefensivas = new ChoiceBox<>();
jugadasDefensivas.getItems().addAll("Intercepcion");


here i have setOnAction listeners

//inicializa botones
TextField tiempo = new TextField();
historial = new Button("Historial");
historial.setOnAction(this);
jugar= new Button("Jugar");
jugar.setOnAction(e -> isInt(tiempo,tiempo.getText()));
jugar.setOnAction(e -> getArbitro(jugadasArbitro));
jugar.setOnAction(e -> getOfensiva(jugadasOfensivas));
jugar.setOnAction(e -> getDefensa(jugadasDefensivas));

//forma del Gui y posiciona los botones
GridPane grid = new GridPane();
grid.setPadding(new Insets(10,10,10,10));
grid.setVgap(8);
grid.setHgap(10);
GridPane.setConstraints(historial, 1, 3);
GridPane.setConstraints(jugar, 2, 2);
GridPane.setConstraints(jugadasArbitro, 3, 3);
GridPane.setConstraints(jugadasOfensivas, 3, 4);
GridPane.setConstraints(jugadasDefensivas, 3, 5);
grid.getChildren().addAll(historial, jugadasArbitro,jugadasDefensivas,jugadasOfensivas,jugar,tiempo);

//tamanio de la ventana
Scene scene = new Scene(grid, 540,300);
primaryStage.setScene(scene);
primaryStage.show();
}


the methods to read the drop box value

//leen el valor de los drop box
private void getDefensa(ChoiceBox<String> jugadasDefensivas) {
// TODO Auto-generated method stub
String opcionDefensa = jugadasDefensivas.getValue();
System.out.println(opcionDefensa);
}

private void getOfensiva(ChoiceBox<String> jugadasOfensivas) {
// TODO Auto-generated method stub
String opcionOfensiva = jugadasOfensivas.getValue();
System.out.println(opcionOfensiva);
}

private void getArbitro(ChoiceBox<String> jugadasArbitro) {
// TODO Auto-generated method stub
String opcionArbitro = jugadasArbitro.getValue();
System.out.println(opcionArbitro);
}

//valida que el tiempo solo sea INT
private boolean isInt(TextField tiempo, String message) {
// TODO Auto-generated method stub
try{
int minutos = Integer.parseInt(tiempo.getText());
return true;
}catch (NumberFormatException e){}
System.out.println("Error: introduzca numeros solamente");
return false;

}

@Override
public void handle(ActionEvent event) {


}

}

Answer

Can't you just have it all in one OnActionHandler? Or if you want it to only process one of them have a variable determine which to test (would be changed through other events and interactions).

jugar.setOnAction(e ->{
    isInt(tiempo,tiempo.getText());
    getArbitro(jugadasArbitro);
    getOfensiva(jugadasOfensivas);
    getDefensa(jugadasDefensivas);
});

OR

jugar.setOnAction(e -> {
    if(method == 1)
    {
        isInt(tiempo,tiempo.getText());
    }
    else if(method == 2)
    {
        getArbitro(jugadasArbitro);
    }
    else if(method == 3)
    {
        getOfensiva(jugadasOfensivas);
    }
    else if(method == 4)
    {
        getDefensa(jugadasDefensivas);
    }
});

Just depends on how you need it.

Comments