2016-01-07 63 views
1

每當在TextField上按下Enter鍵時,如何獲得對話框上的確定按鈕。我已經嘗試了下面的代碼。但是在給出代碼時,無論何時在「city_D」(TextField)上按Enter鍵,OK按鈕都必須被聚焦。如何在Javafx中請求關注對話框確定按鈕?

package dialogdemo; 

import java.util.ArrayList; 
import java.util.List; 
import java.util.Optional; 
import javafx.application.Application; 
import javafx.application.Platform; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.ButtonBar; 
import javafx.scene.control.ButtonType; 
import javafx.scene.control.Dialog; 
import javafx.scene.control.TextField; 
import javafx.scene.input.KeyCode; 
import javafx.scene.input.KeyEvent; 
import javafx.scene.layout.Priority; 
import javafx.scene.layout.StackPane; 
import javafx.scene.layout.VBox; 
import javafx.stage.Stage; 

/** 
* 
* @author vikassingh 
*/ 
public class DialogDemo extends Application { 

    String street_1 = ""; 
    String street_2 = ""; 
    String city = ""; 

    @Override 
    public void start(Stage primaryStage) { 
     Button btn = new Button(); 
     btn.setText("Say 'Hello World'"); 
     btn.setOnAction(new EventHandler<ActionEvent>() { 

      @Override 
      public void handle(ActionEvent event) { 
       System.out.println("Hello World!"); 

       TextField street_1_D = new TextField(); 
       TextField street_2_D = new TextField(); 
       TextField city_D = new TextField(); 

       Dialog<List<String>> dialog = new Dialog<>(); 
       dialog.setTitle("Address"); 
       dialog.setHeaderText(null); 
       dialog.setGraphic(null); 

       // Set the button types. 
       ButtonType okButtonType = new ButtonType("Ok", ButtonBar.ButtonData.OK_DONE); 

       dialog.getDialogPane().getButtonTypes().addAll(okButtonType, ButtonType.CANCEL); 
       dialog.getDialogPane().setStyle("-fx-background-color: #fff;"); 

       VBox box = new VBox(); 
       VBox.setVgrow(box, Priority.ALWAYS); 

       box.getChildren().addAll(street_1_D, street_2_D, city_D); 
       dialog.getDialogPane().setContent(box); 

       // Request focus on the username field by default. 
       Platform.runLater(() -> street_1_D.requestFocus()); 

       // Dialog All Listner 
       street_1_D.setOnKeyPressed(new EventHandler<KeyEvent>() { 
        public void handle(KeyEvent event) { 
         if (event.getCode() == KeyCode.ENTER || event.getCode() == KeyCode.TAB || event.getCode() == KeyCode.DOWN) { 
          street_2_D.requestFocus(); 
          event.consume(); 
         } 
        } 
       }); 
       street_2_D.setOnKeyPressed(new EventHandler<KeyEvent>() { 
        public void handle(KeyEvent event) { 
         if (event.getCode() == KeyCode.ENTER || event.getCode() == KeyCode.TAB || event.getCode() == KeyCode.DOWN) { 
          city_D.requestFocus(); 
          event.consume(); 
         } 
         if (event.getCode() == KeyCode.UP) { 
          street_1_D.requestFocus(); 
          event.consume(); 
         } 
        } 
       }); 
       city_D.setOnKeyPressed(new EventHandler<KeyEvent>() { 
        public void handle(KeyEvent event) { 
         if (event.getCode() == KeyCode.ENTER || event.getCode() == KeyCode.TAB || event.getCode() == KeyCode.DOWN) { 
          //okButtonType.requestFocus(); 
          event.consume(); 
         } 
         if (event.getCode() == KeyCode.UP) { 
          street_2_D.requestFocus(); 
          event.consume(); 
         } 
        } 
       }); 

       // END Dialog All Listner 
       List<String> databaseFiles = new ArrayList<String>(); 
       dialog.setResultConverter(dialogButton -> { 
        if (dialogButton == okButtonType) { 
         street_1 = street_1_D.getText(); 
         databaseFiles.add(street_1); 
         street_2 = street_2_D.getText(); 
         databaseFiles.add(street_2); 
         city = city_D.getText(); 
         databaseFiles.add(city); 
         return databaseFiles; 
        } 
        return null; 
       }); 

       Optional<List<String>> result = dialog.showAndWait(); 
       if (result.isPresent()) { 
        System.out.println("Street 1: " + street_1 + " \n Street 2: " + street_2 + "\n City: " + city); 
       } else { 
        System.out.println("Cancle"); 
       } 
      } 
     }); 

     StackPane root = new StackPane(); 
     root.getChildren().add(btn); 

     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

你可以從對話框面板上的按鈕,並要求重點是這樣的:

city_D.setOnKeyPressed(new EventHandler<KeyEvent>() { 
    @Override 
    public void handle(KeyEvent event) { 
     if (event.getCode() == KeyCode.ENTER || 
      event.getCode() == KeyCode.TAB || 
      event.getCode() == KeyCode.DOWN) { 

      dialog.getDialogPane().lookupButton(okButtonType).requestFocus(); 
      event.consume(); 
     } 
     if (event.getCode() == KeyCode.UP) { 
      street_2_D.requestFocus(); 
      event.consume(); 
     } 
    } 
}); 
0

首先,它聽起來並不像你真正想要的是「焦點訪談」按鈕。要讓按鈕響應「Enter」,您需要將其設爲「默認」按鈕。最明顯的做法是將按鈕的DefaultButton屬性綁定到city_D字段的Focused屬性。

但是,您也可以在TextField上設置OnAction,當您在文本框中按Enter>時,會觸發該選項,這意味着您可以在沒有OK按鈕的情況下執行OK按鈕。

此外,您可以將Button的DefaultButton屬性綁定到Button的Focused屬性。然後,當您在最後一個字段上按下「TAB」(將焦點傳遞給按鈕),然後按下「Enter」時,它會觸發。個人而言,我不會搞亂UP,DOWN和ENTER遍歷的東西。大多數人習慣於使用TAB和SHIFT-TAB在屏幕上移動,而其他的東西只是使代碼變得毫無價值。如果你確實想這樣做,我會考慮使用基於TraversalEngine的解決方案。

但是,如果你真的想使用< Enter>移動到下一個字段,我會使用OnAction來做到這一點。下面是顯示所有的這些東西的混合物的樣品:

public class sampleFrame2 extends Application { 

class TestPane extends BorderPane { 

    private Label label; 
    private TextField tf1 = new TextField(); 
    private TextField tf2 = new TextField(); 
    private TextField tf3 = new TextField(); 
    private Button button1 = new Button("the button"); 
    private Text text = new Text("Not set"); 

    public TestPane() { 
     VBox vbox = new VBox(); 
     vbox.getChildren().addAll(tf1, tf2, tf3, button1, text); 
     tf1.setOnAction(evt -> tf2.requestFocus()); 
     tf2.setOnAction(evt -> tf3.requestFocus()); 
     tf3.setOnAction(evt -> text.setText("From tf3")); 
     button1.setOnAction(evt -> text.setText("From button1")); 
     button1.defaultButtonProperty().bind(button1.focusedProperty()); 

     setCenter(vbox); 
    } 
} 

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

@Override 
public void start(Stage primaryStage) { 

    Pane root = new TestPane(); 
    primaryStage.setScene(new Scene(root, 300, 250)); 
    primaryStage.show(); 
} 

}

相關問題