我有一个JavaFX GUI,我希望拦截按下SpaceBar并使用它来调用方法。我写了一个似乎可以解决问题的EventFilter。它包含命令 event.consume(),我认为它应该使 KeyEvent 不会传播到各种控件。
我的问题是,当我添加 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();
}
}
}
答案 0 :(得分:3)
文本字段可能正在侦听KEY_TYPED
个事件。与well-documented一样,getCode()
会为KeyCode.UNDEFINED
事件返回KEY_TYPED
。因此,你不会遇到这种情况。
您可以检查character
变量以及code
变量来处理所有情况:
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 || " ".equals(event.getCharacter()))
{
if (event.getEventType() == KeyEvent.KEY_PRESSED)
{
System.out.println("Code that responds to SpaceBar");
}
event.consume();
}
}
}
答案 1 :(得分:1)
我可以想到一个简单的解决方案,虽然它不会阻止空间被添加到TextField
,但是在添加changeListener
后几乎立即添加它就会替换它到TextProperty
的{{1}}:
TextField
这也可能有用http://fxexperience.com/2012/02/restricting-input-on-a-textfield/