2016-11-09 2 views
4

Ceci est la classe principale pour créer l'interface utilisateur:Comment effectuer plusieurs actions pour un bouton en fonction de la sélection ComboBox dans JavaFX

public class Test extends Application { 

@Override 
public void start(Stage primaryStage) { 

    FlowPane mainPane = new FlowPane();   


    FlowPane query = new FlowPane();    
    query.setPadding(new Insets(30,30,30,30)); 
    query.setHgap(10); 
    query.setVgap(20); 

    ComboBox<String> queryDropDown = new ComboBox<>();  
    queryDropDown.getItems().addAll("Gene", "Disease"); 
    queryDropDown.setValue("Select One"); 
    System.out.println(queryDropDown.getValue()); 


    query.getChildren().addAll(new Label("Select Category: "), queryDropDown); 


    FlowPane userInput = new FlowPane();    
    userInput.setPadding(new Insets(30,30,30,30)); 
    userInput.setHgap(10); 
    userInput.setVgap(20); 

    TextField searchField = new TextField();  
    searchField.setPrefColumnCount(3); 
    userInput.getChildren().addAll(new Label("Enter Query: "), new TextField()); 




    FlowPane searchButtonPane = new FlowPane();   

    searchButtonPane.setPadding(new Insets(30,30,30,200)); 
    searchButtonPane.setHgap(50); 
    searchButtonPane.setVgap(50); 
    Button searchButton = new Button("Search"); 

    searchButtonPane.getChildren().addAll(searchButton); 

    ButtonHandlerClass handler1 = new ButtonHandlerClass();  
    searchButton.setOnAction(handler1); 


    mainPane.getChildren().addAll(query, userInput, searchButtonPane);  

    Scene scene = new Scene(mainPane, 300, 250); 
    primaryStage.setTitle("Genetic Database"); 
    primaryStage.setScene(scene); 
    primaryStage.show(); 





} 


public static void main(String[] args) { 
    // Prints "Hello, World" to the terminal window. 
    System.out.println("Hello, World"); 
    Application.launch(args); 



} 

} 

C'est le gestionnaire de bouton classe

public class ButtonHandlerClass implements EventHandler<ActionEvent> { 

@Override 
public void handle(ActionEvent e) { 
    System.out.println("Button Clicked"); 



} 

} 

Je veux pour pouvoir avoir le même bouton "search" effectuer une action différente en fonction de l'option choisie par l'utilisateur dans la combo. J'ai essayé de faire quelque chose de similaire au ButtonHandlerClass pour la zone de liste déroulante. Tout avis sera le bienvenu.

Merci!

+0

Vous voulez créer à 100% le 'ButtonHandlerClass' ou vous êtes ouvert à d'autres solutions? – GOXR3PLUS

+0

Je suis novice en matière de programmation. Par conséquent, toute solution de rechange qui, selon vous, fonctionnerait mieux serait géniale à apprendre! – NSar

+0

Généralement, avant 'JavaFX' dans' Swing Library', il était très courant d'utiliser une classe externe qui implémente 'MouseAdapter'. – GOXR3PLUS

Répondre

3

Gardez ce gestionnaire d'événements pour way 1 et way 3:

  // Using an event handler 
      EventHandler<ActionEvent> handler = new EventHandler<ActionEvent>() { 
       @Override 
       public void handle(ActionEvent arg0) { 
        String selectedItem = queryDropDown.getSelectionModel().getSelectedItem(); 
        System.out.println(selectedItem); 
        // ...code 
       } 
      }; 

Way 1:

 //note that every time one action event handler is called 
     //instead for multiple handlers you can use the way 3 
     searchButton.setOnAction(handler); 

Way 2 (éviter de créer des classes anonymes):

//using lambda expression 
    searchButton.setOnAction(a->{ 
     String selectedItem = queryDropDown.getSelectionModel().getSelectedItem(); 
     System.out.println(selectedItem); 
     // ...code  
    }); 

Way 3:

(vous pouvez ajouter gestionnaire d'événements multiples et tous seront appelés) (par exemple, vous pouvez ajouter plusieurs gestionnaires d'événements d'action ...)

[C'est quelque chose que vous ne pouvez pas faire avec way 1 et way 2]:

//adding an event handler 
    searchButton.addEventHandler(ActionEvent.ACTION,handler); 

    //or 

    searchButton.addEventHandler(ActionEvent.ACTION,a->{ 
     String selectedItem = queryDropDown.getSelectionModel().getSelectedItem(); 
     System.out.println(selectedItem); 
     // ...code  
    }); 

Way 4:

En utilisant une classe externe (non recommandé, sauf si vous avez le code tant que vous ne voulez pas que votre classe actuelle d'être trop lignes);()

ici peut être différentes situations:

  • La classe sera imbriquée à votre classe actuelle?
  • La variable ComboBox est une variable globale accessible depuis la classe imbriquée?
  • Si!2 alors vous devez passer une référence de celui-ci sur le constructeur de la classe externe
  • Il y a un million de situations

    // Situation 3 Code:

    public class ButtonHandlerClass implements EventHandler<ActionEvent> { 
    
        ComboBox<String> comboBox; 
    
        /** 
        *Constructor 
        */ 
        public ButtonHandlerClass(ComboBox comboBox){ 
    
        this.comboBox = comboBox; 
    
        } 
    
    @Override 
        public void handle(ActionEvent e) { 
        String selectedItem = queryDropDown.getSelectionModel().getSelectedItem(); 
          System.out.println(selectedItem); 
          // ...code 
    
        } 
    
    } 
    
    } 
    
+0

C'est fantastique. Je crois que je comprends tous les 4 façons dont vous êtes entré et je comprends aussi pourquoi un cours externe ne serait pas recommandé. Utiliser plusieurs classes pour un même projet est toujours un domaine dans lequel je suis flou, alors j'essaie de le pratiquer pour l'instant. J'ai mis en œuvre les 4 façons de voir si je pouvais les amener à travailler et jusqu'ici tout va bien. Merci pour l'aide! – NSar

+1

@NSar la façon dont 4 n'est pas quelque chose de très complexe, vous avez juste besoin de connaître Java bien.Pour comprendre les 'références' 'constantes' statiques, pratiquez-les et vous serez. Également une bonne connaissance de' lambda' et 'méthode La référence est appropriée pour Java 8 et plus. Cela améliorera votre code et vos performances! – GOXR3PLUS

+1

Génial, je vais être sûr de vérifier ceux-ci – NSar

2

Pourquoi pas seulement utiliser un statment de commutateur?

@Override 
public void start(Stage primaryStage) { 

    VBox vbox = new VBox(); 
    ComboBox<String> comboBox = new ComboBox(); 
    ObservableList<String> options = FXCollections.observableArrayList("one", "two", "three"); 
    comboBox.setItems(options); 
    Button btn = new Button(); 
    btn.setText("Say 'Hello World'"); 
    btn.setOnAction((ActionEvent event) -> { 
     if(comboBox.getValue() != null) 
     { 
      String tempString = comboBox.getSelectionModel().getSelectedItem(); 
      System.out.print(tempString); 
      switch(tempString) 
      { 
       case "one": 
        btn.setText("one is selected in combobox"); 
        break; 
       case "two": 
        btn.setText("two is selected in combobox"); 
        break; 
       case "three": 
        btn.setText("three is selected in combobox"); 
        break; 
       default: 
        btn.setText("Nothing is selected in combobox"); 
      } 
     } 
    }); 

    StackPane root = new StackPane(); 
    vbox.getChildren().addAll(btn, comboBox); 
    root.getChildren().addAll(vbox); 

    Scene scene = new Scene(root, 300, 250); 

    primaryStage.setTitle("Hello World!"); 
    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 

/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) { 
    launch(args); 
} 
+1

Je n'ai même pas pensé à une déclaration de commutateur, certainement un moyen facile d'accomplir cela. Je garderai cela à l'esprit pour les prochains numéros. Merci! – NSar