JavaFX TextArea删除快捷键Ctrl+的默认撤消操作;Z
我正在尝试创建一个可编辑的Java FX TextArea,它不能用快捷键Ctrl+Z撤消最后一步。默认情况下,当您创建一个可编辑的JavaFXJavaFX TextArea删除快捷键Ctrl+的默认撤消操作;Z,java,javafx,Java,Javafx,我正在尝试创建一个可编辑的Java FX TextArea,它不能用快捷键Ctrl+Z撤消最后一步。默认情况下,当您创建一个可编辑的JavaFXTextArea时,JavaFX在文本区域处于焦点时为快捷键Ctrl+Z/Ctrl+Y提供默认的撤消/重做功能(以及复制、粘贴等)。我想禁用快捷键Ctrl+Z和Ctrl+Y的这些默认操作,以便能够创建自己的撤消/重做逻辑,而不是JavaFX提供的默认逻辑。另外:我不想完全禁用JFX中的undo-redo逻辑,因为我在以后使用它,(textarea.und
TextArea
时,JavaFX在文本区域处于焦点时为快捷键Ctrl+Z/Ctrl+Y提供默认的撤消/重做功能(以及复制、粘贴等)。我想禁用快捷键Ctrl+Z和Ctrl+Y的这些默认操作,以便能够创建自己的撤消/重做逻辑,而不是JavaFX提供的默认逻辑。另外:我不想完全禁用JFX中的undo-redo逻辑,因为我在以后使用它,(textarea.undo()
和textarea.redo()
)我只想删除默认创建的按键事件,我该怎么做
代码:我用FXML在BorderPane内创建了一个TextArea,并在FXML上附加了一个控制器,因此可以通过代码访问TextArea,而不使用css文件。您有几个选项:
常见的一点是,它们使用事件类的方法
1)使用:
TextArea ta = new TextArea();
final KeyCombination keyCombCtrZ = new KeyCodeCombination(KeyCode.Z, KeyCombination.SHORTCUT_DOWN;
final KeyCombination keyCombCtrY = new KeyCodeCombination(KeyCode.Y, KeyCombination.SHORTCUT_DOWN);
ta.setOnKeyPressed(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event) {
if (keyCombCtrZ.match(event) || keyCombCtrY.match(event) ) {
event.consume();
}
}
});
TextArea ta = new TextArea();
ta.setOnKeyPressed(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event) {
if ((event.getCode() == KeyCode.Z || event.getCode() == KeyCode.Y)
&& event.isShortcutDown()) {
event.consume();
}
}
});
TextArea ta=newtextarea();
final KeyCombination keyCombCtrZ=新的keycodecompbination(KeyCode.Z,KeyCombination.SHORTCUT_DOWN;
final KeyCombination keyCombCtrY=新的keycodecompbination(KeyCode.Y,KeyCombination.SHORTCUT\u DOWN);
ta.setOnKeyPressed(新的EventHandler(){
@凌驾
公共无效句柄(KeyEvent事件){
如果(keyCombCtrZ.match(事件)| | keyCombCtrY.match(事件)){
event.consume();
}
}
});
2)使用方法:
TextArea ta = new TextArea();
final KeyCombination keyCombCtrZ = new KeyCodeCombination(KeyCode.Z, KeyCombination.SHORTCUT_DOWN;
final KeyCombination keyCombCtrY = new KeyCodeCombination(KeyCode.Y, KeyCombination.SHORTCUT_DOWN);
ta.setOnKeyPressed(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event) {
if (keyCombCtrZ.match(event) || keyCombCtrY.match(event) ) {
event.consume();
}
}
});
TextArea ta = new TextArea();
ta.setOnKeyPressed(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event) {
if ((event.getCode() == KeyCode.Z || event.getCode() == KeyCode.Y)
&& event.isShortcutDown()) {
event.consume();
}
}
});
TextArea ta=newtextarea();
ta.setOnKeyPressed(新的EventHandler(){
@凌驾
公共无效句柄(KeyEvent事件){
if((event.getCode()==KeyCode.Z | | event.getCode()==KeyCode.Y)
&&event.isShortcutDown()){
event.consume();
}
}
});
将事件过滤器添加到文本区域,并在与快捷方式匹配时使用事件:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.TextArea;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.stage.Stage;
public class TextAreaNoUndo extends Application {
@Override
public void start(Stage primaryStage) {
TextArea area = new TextArea();
area.addEventFilter(KeyEvent.ANY, e -> {
if (e.getCode() == KeyCode.Z && e.isShortcutDown()) {
e.consume();
}
});
primaryStage.setScene(new Scene(area));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
请注意,这些快捷方式似乎是特定于平台的。在Ubuntu 16.04上,Ctrl-Y似乎什么都不做,重做是Ctrl-Shift-Z。(刚刚测试过这个)@Arjan谢谢,很高兴知道这一点,但这是一个需要解决的问题,可能还有其他配置的平台。最好是通过属性文件配置快捷方式…“Control”不是正确的修改器;它在Mac上不起作用。您应该使用“快捷方式”,它是独立于平台的。由于提供了多个解决方案而被接受,这些解决方案都经过测试并适用于我的案例。@James_D感谢您提供了这些有用的建议,因此我以前多次犯过错误。:-)谢谢您的更正@James\u D,答案现在更新了。@DVarga请同时更正第一部分:它是KeyCombination.SHORTCUT\u DOWN而不是KeyCombination.CONTROL\u DOWN,正如我在编辑中建议的那样。。