У меня есть графический интерфейс JavaFX, где я хочу перехватить нажатие SpaceBar и использовать его для вызова метода. Я написал EventFilter, который, кажется, делает трюк. Он включает в себя команду event.consume(), которая, как я полагаю, должна содержать KeyEvent от распространения на различные элементы управления.EventFilter потребляет() не мешает SpaceChars в TextField
Моя проблема заключается в том, что когда я добавил TextField, и это поле имеет фокус, пресса пробела не потребляется, как я думал. «» Захватываются TextField. Я хотел бы перехватить и предотвратить добавление «» в TextField.
Что я оставляю в приведенном ниже коде, чтобы «добраться до TextField»? Api, если я читаю его правильно, говорит, что фильтры, зарегистрированные в родительском элементе управления, могут перехватывать событие до того, как он достигнет дочерних узлов. Но даже при установке фильтра непосредственно на TextField у меня все еще есть «" символы в TextField.
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.stage.Stage;
public class SpaceIntercept extends Application implements EventHandler <KeyEvent>
{
public static void main(String[] args)
{
Application.launch(args);
}
@Override
public void start(Stage primaryStage)
{
TextField textField = new TextField("asdf");
Group root = new Group();
Scene scene = new Scene(root, 200, 100);
scene.addEventFilter(KeyEvent.ANY, event -> handle(event));
// root.addEventFilter(KeyEvent.ANY, event -> handle(event));
// textField.addEventFilter(KeyEvent.ANY, event -> handle(event));
root.getChildren().add(textField);
primaryStage.setScene(scene);
primaryStage.show();
}
@Override
public void handle(KeyEvent event)
{
if (event.getCode() == KeyCode.SPACE)
{
if (event.getEventType() == KeyEvent.KEY_PRESSED)
{
System.out.println("Code that responds to SpaceBar");
}
event.consume();
}
}
}
@James_D Почти не видел it.Thanks, во всяком случае я редактировал ответ, и он работает, даже если 'ПРОСТРАНСТВО 'находится между существующим текстом. Хотя это просто догадка, нуждается ли OP. – GOXR3PLUS
Я нашел этот ответ полезным. Мои первые попытки заменить содержимое TextField не помогли, так что хорошо видеть, как вы это сделали. Ответ James_D был выбран потому, что он устраняет необходимость редактировать поле. –
@Phil Freihofner И вот как это должно быть. Я также не знал решения, которое James_D добавил в его ответе;) – GOXR3PLUS