Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX TextArea删除快捷键Ctrl+的默认撤消操作;Z_Java_Javafx - Fatal编程技术网

JavaFX TextArea删除快捷键Ctrl+的默认撤消操作;Z

JavaFX 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

我正在尝试创建一个可编辑的Java FX TextArea,它不能用快捷键Ctrl+Z撤消最后一步。默认情况下,当您创建一个可编辑的JavaFX
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,正如我在编辑中建议的那样。。