我正在尝试检测何时按下加号键,哪个在我的英国键盘上定位在EQUALS键上,而在我的德语键盘上定位在另一个键上。我希望能够在没有用户按下SHIFT的情况下检测加号键,以防通过shift +另一个键正常达到加号。
这是普通缩放操作在例如浏览器中的工作方式。如何在没有列出每个键盘和相应键的位置的情况下在JavaFX中执行此操作?
例如,下面的程序(检查KeyCode.PLUS)在我的英国键盘上不起作用。我使用的是JDK 1.8.0_40。
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
public class Test extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) throws Exception {
Scene scene = new Scene(new Pane());
scene.addEventFilter(KeyEvent.KEY_PRESSED, e -> {
if (e.getCode() == KeyCode.PLUS) {
System.out.println("YES");
}
});
stage.setScene(scene);
stage.show();
}
}
答案 0 :(得分:4)
如果您希望它适用于所有平台和键盘布局,则需要原始字符和KeyEvent.KEY_PRESSED过滤器。来自KeyEvent文档:
"键入键入"事件是更高级别的,通常不依赖于 平台或键盘布局。它们是在Unicode时生成的 输入字符,是了解的首选方式 字符输入。在最简单的情况下,生成键类型事件 通过单键按下(例如,' a')。
但要注意:
然而,通常,字符是由一系列按键产生的 (例如,SHIFT +' a'),以及从按键事件到键的映射 键入的事件可以是多对一或多对多。
将它们混合可以得到一个相当难看且难以理解的代码。
所以你的例子应该是这样的:
我已将事件更改为KEY_PRESSED并使您的示例(Ctrl +' +')尝试工作,即使代码相等或字符相等。在大多数情况下,它适用于代码,但有时charCombo适合。
我已尝试使用英语(英国),法语,德语,西班牙语键盘布局的以下代码,它可以正常运行。
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.input.KeyCharacterCombination;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyCodeCombination;
import javafx.scene.input.KeyCombination;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
public class Test extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) throws Exception {
Scene scene = new Scene(new Pane(), 300, 300);
scene.setOnKeyPressed(new EventHandler<KeyEvent>() {
KeyCombination charCombo = new KeyCharacterCombination("+", KeyCombination.CONTROL_DOWN);
KeyCombination codeCombo = new KeyCodeCombination(KeyCode.PLUS, KeyCombination.CONTROL_DOWN);
@Override
public void handle(KeyEvent event) {
if (charCombo.match(event) || codeCombo.match(event)) {
System.out.println("Zoom in");
}
}
});
stage.setScene(scene);
stage.show();
}
}
答案 1 :(得分:1)
我测试了你的程序,工作组合是测试:
KeyCode.ADD
:这对应于小键盘上的+
键; KeyCode.EQUALS
:这与=
键相对应,因为您不希望用户按Shift
。KeyCode.PLUS
:当上限被锁定时,这与=
键相对应。public class Test extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) throws Exception {
Scene scene = new Scene(new Pane());
scene.addEventFilter(KeyEvent.KEY_PRESSED, e -> {
if (e.getCode() == KeyCode.ADD || e.getCode() == KeyCode.EQUALS || e.getCode() == KeyCode.PLUS) {
System.out.println("YES");
}
});
stage.setScene(scene);
stage.show();
}
}