2015-10-21 8 views
1

Я пытаюсь вызвать ключ backspace на виртуальной клавиатуре для сенсорной системы. это мой код, который я пробовал до сих пор.JavaFX8 KeyEvent - Триггер Backspace Key на текстовом поле

Button source = new Button("Backspace"); 
TextField target = new TextField(); 
KeyEvent ke = new KeyEvent(source, target, KeyEvent.KEY_TYPED, "", "", KeyCode.BACK_SPACE, false, false, false, false); 
target.fireEvent(ke); 

этот код не возвращают ничего ...

+0

Почему просто не делать [ 'target.deletePreviousChar()'] (http://docs.oracle.com/javase/8/javafx/api/javafx/ сцена/контроль/TextInputControl.html # deletePreviousChar--)? –

+0

Спасибо @James_D, но мне нужно знать, что есть удобный способ использовать Backspace в KeyEvent ?? – Hiran

+0

Зачем вам это нужно? –

ответ

0

Вы можете непосредственно сделать TextField вести себя так, как будто клавиша Backspace была нажата, вызвав target.deletePreviousChar(), который, вероятно, является гораздо более эффективным подходом.

Чтобы имитировать реальное нажатие клавишиBackspace, потребуются следующие изменения:

  • текстовое поле реагирует на KEY_PRESSED событий, а не KEY_TYPED событий. Вероятно, лучше всего создать целую последовательность событий, которые происходят при вводе ключа: KEY_PRESSED, KEY_TYPED и KEY_RELEASED.
  • Текстовое поле должно иметь фокус. Вы можете помешать кнопке получить фокус с source.setFocusTraversable(false).
  • KeyCode для KEY_TYPED событий должно быть UNDEFINED (см. Документы).

Вот SSCCE:

import javafx.application.Application; 
import javafx.geometry.Pos; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.TextField; 
import javafx.scene.input.KeyCode; 
import javafx.scene.input.KeyEvent; 
import javafx.scene.layout.VBox; 
import javafx.stage.Stage; 

public class TriggerBackspaceOnTextField extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     TextField textField = new TextField(); 
     Button backspace = new Button("Backspace"); 
     backspace.setFocusTraversable(false); 
     backspace.setOnAction(e -> { 
      KeyEvent press = new KeyEvent(backspace, textField, KeyEvent.KEY_PRESSED, "", "", KeyCode.BACK_SPACE, false, false, false, false); 
      textField.fireEvent(press); 
      KeyEvent typed = new KeyEvent(backspace, textField, KeyEvent.KEY_TYPED, "", "", KeyCode.UNDEFINED, false, false, false, false); 
      textField.fireEvent(typed); 
      KeyEvent release = new KeyEvent(backspace, textField, KeyEvent.KEY_RELEASED, "", "", KeyCode.BACK_SPACE, false, false, false, false); 
      textField.fireEvent(release); 
     }); 

     VBox root = new VBox(10, textField, backspace); 
     root.setAlignment(Pos.CENTER); 
     Scene scene = new Scene(root, 350, 200); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

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