gpt4 book ai didi

JavaFX 文本字段 : disabling cursor movement

转载 作者:行者123 更新时间:2023-12-02 05:04:44 31 4
gpt4 key购买 nike

我创建了一个自定义组件,它扩展了 TextField 并允许对特定类型的字符串进行高级编辑。

箭头键已被重新定义以允许特定行为并且应该不会触发默认的插入符移动但是我似乎无法阻止它移动。我已经使用了()我能想象到的每一种类型的事件,插入符号在按下箭头键时总是会移动。

此外,当输入一个新字母时,首先要对其进行验证,如果发现无效,则撤消编辑。但是,插入符号总是移动一个位置,而当您输入的字母无效时,插入符号不应移动。

我目前有适当的逻辑,可以将插入符号移动到正确的位置,以便控件或多或少地工作,唯一的问题是用户看到插入符号在代码试图对抗默认移动时疯狂地跳来跳去。

有趣的一点:我为控件提供了一个上下文菜单,当显示上下文菜单时,插入符号停止其默认移动(或者它突然足够快以至于用户看不到它)。

我正在深入研究上下文菜单的源代码,看看它是否设置或取消设置某些内容,但我没有看到它。有什么想法可以停止文本字段的默认插入符号移动吗?

最佳答案

您可以使用事件过滤器来阻止节点处理左右箭头:

textField.addEventFilter(KeyEvent.ANY, new EventHandler<KeyEvent>() {
@Override public void handle(KeyEvent keyEvent) {
switch (keyEvent.getCode()) {
case LEFT:
case RIGHT:
keyEvent.consume();
}
}
});

虽然这样做有点奇怪,因为 TextField 将不再像用户通常期望的那样行事。

可执行样本

import javafx.application.*;
import javafx.beans.*;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class TextFieldControl extends Application {
@Override public void start(Stage stage) {
final TextField textField = new TextField("Phone: ");
textField.addEventFilter(KeyEvent.ANY, new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent keyEvent) {
switch (keyEvent.getCode()) {
// block cursor control keys.
case LEFT:
case RIGHT:
case UP:
case DOWN:
case PAGE_UP:
case PAGE_DOWN:
case HOME:
case END:
keyEvent.consume();

// allow deletion and tab.
case DELETE:
case BACK_SPACE:
case TAB:
return;
}

// only allow digits and a few punctuation symbols to be entered.
if (!"0123456789-() ".contains(keyEvent.getCharacter())) {
keyEvent.consume();
}
}
});

textField.focusedProperty().addListener(new InvalidationListener() {
@Override public void invalidated(Observable observable) {
// due to some weirdness JavaFX will auto select the text when the text field
// receives focus, so instead deselect and position the caret at the end of the field.
// Another weird thing is that a pulse must be run before the deselection or caret
// positioning request occurs or it won't take effect, so a runnable seems to suffic to ensure that.
Platform.runLater(new Runnable() {
@Override public void run() {
textField.deselect();
textField.positionCaret(textField.getText().length());
}
});
}
});

VBox layout = new VBox();
layout.getChildren().setAll(new VBox(textField, new TextField()));
stage.setScene(new Scene(layout));
stage.show();

textField.requestFocus();
}

public static void main(String[] args) {
launch(args);
}
}

关于JavaFX 文本字段 : disabling cursor movement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16441080/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com