为了账号安全,请及时绑定邮箱和手机立即绑定

如何更正 TextField 中的希腊重音字符

如何更正 TextField 中的希腊重音字符

哔哔one 2023-06-21 15:06:22
我面临的问题是当我有一个输入(TextField、TextArea 等)并且我试图插入一些包含重音字符的希腊单词时。像“Γìτα”(猫)这样的词很好用。不幸的是,我无法输入像“Ταϊτή”(塔希提岛)这样的词。如果我尝试复制并粘贴它或对其进行硬编码,它工作正常,但是当我尝试使用以下组合来写这个词时Shift + ';' +我应该产生'ϊ',而不是我得到'¨ι'这是一个例子:import javafx.application.Application;import javafx.geometry.Insets;import javafx.geometry.Pos;import javafx.scene.Scene;import javafx.scene.control.TextField;import javafx.scene.layout.VBox;import javafx.stage.Stage;public class Example extends Application {    public static void main(String[] args) {        launch(args);    }    @Override    public void start(Stage stage) throws Exception {        VBox mainBox = new VBox(10);        mainBox.setPadding(new Insets(20));        mainBox.setAlignment(Pos.CENTER);        // Ταϊτή = Tahiti        TextField field1 = new TextField("Ταϊτή");        TextField field2 = new TextField();        mainBox.getChildren().add(field1);        mainBox.getChildren().add(field2);        field1.setStyle("-fx-font-size:24px");        field2.setStyle("-fx-font-size:24px");        stage.setScene(new Scene(mainBox));        stage.show();    }}下图显示了我自己输入单词时的结果安装的 JRE:jre1.8.0_221安装的JDK:jdk1.8.0_221为了将 IDE (Eclipse) 排除在问题的起因之外,我在 SceneBuilder 上仅使用一个 AnchorPane 和一个 TextField 测试了此行为,我在那里也遇到了同样的问题。但为了便于讨论,我在 Eclipse 中使用编辑器和所有设置来使用编码 UTF-8。所以我想问:这是当前 JRE/JDK 的错误吗?如果是,是否有我可以使用的众所周知的解决方案,或者我应该只使用 Listener 来捕获输入并自己更正?编辑:正如 Sedrick 指出的那样,我可以使用 alt + 0 2 3 9 的组合,但这将产生一种不同类型的字母,它与希腊字母相似但不相同。看下图。不幸的是,这不是我的客户想要的行为,因为输入它的正确方法(用希腊键盘)是使用:Shift + ';' + ι ,其中“ι”是英文字母“i”。
查看完整描述

2 回答

?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

我可以重现这种行为。如果您在舞台上添加一个,EventHandler您可以清楚地看到问题。

stage.addEventFilter(KeyEvent.KEY_TYPED, ev -> {
    System.out.println("Key typed: " + ev.getCharacter());
});

输出:

Key typed: ¨
Key typed: Ι
Key typed: ¨
Key typed: ι

我们对此无能为力,只能提交错误报告。

我不知道您是否可以在KeyEvents发送这些键之前捕获键入的键,但您可以在阶段级别过滤它们。

stage.addEventFilter(KeyEvent.KEY_TYPED, new KeyTypedListener());

这不是很好,而是一种更“全球”的改变行为的方式。

public class KeyTypedListener implements EventHandler<KeyEvent> {


    private boolean disabled = false;

    private Map<String, String> charCombinations = new HashMap<>();

    private KeyEvent pendingEvent;


    public KeyTypedListener() {

        charCombinations.put("¨ι", "ϊ");

        charCombinations.put("¨Ι", "Ϊ");

    }


    @Override

    public void handle(final KeyEvent event) {


        if (disabled || event.getCharacter() == null

                || event.getCharacter().length() != 1) {

            return;

        }


        final String typed = event.getCharacter();


        if (pendingEvent == null && isCombiCharacter(typed)) {

            pendingEvent = event.copyFor(event.getSource(), event.getTarget());

            event.consume();


        } else if (pendingEvent != null) {

            String combination =

                    charCombinations.get(pendingEvent.getCharacter() + typed);


            if (combination == null) {

                disabled = true;

                fireEvent(pendingEvent);

                disabled = false;

                pendingEvent = null;

            } else {

                event.consume();

                pendingEvent = null;


                Platform.runLater(() -> {

                    fireEventWithCharacter(event, combination);

                });

            }

        }

    }


    private boolean isCombiCharacter(final String character) {

        return "¨".equals(character);

    }


    private void fireEvent(final KeyEvent event) {

        Event.fireEvent(event.getTarget(), event);

    }


    private void fireEventWithCharacter(final KeyEvent event,

            final String character) {

        fireEvent(new KeyEvent(event.getSource(), event.getTarget(),

                event.getEventType(), character, "", KeyCode.UNDEFINED,

                event.isShiftDown(), event.isControlDown(), event.isAltDown(),

                event.isMetaDown()));

    }

}

当然你也可以创建一个新的EventDispatcher.


查看完整回答
反对 回复 2023-06-21
?
蛊毒传说

TA贡献1895条经验 获得超3个赞

我认为这是希腊键盘的问题。我尝试使用其他文本字段(Opera 搜索栏、Google 搜索栏等),但无法写出这个字符。您只能使用 Alt+0239 组合来编写此内容。您可以尝试使用“field2.setOnKeyPressed()”创建组合。



查看完整回答
反对 回复 2023-06-21
  • 2 回答
  • 0 关注
  • 143 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信