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

我面临的问题是当我有一个输入(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();

    }

}

下图显示了我自己输入单词时的结果

http://img4.mukewang.com/6492a1920001de2803570212.jpg

安装的 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”。

http://img4.mukewang.com/6492a19b0001547d03580212.jpg

哔哔one
浏览 136回答 2
2回答

qq_遁去的一_1

我可以重现这种行为。如果您在舞台上添加一个,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.

蛊毒传说

我认为这是希腊键盘的问题。我尝试使用其他文本字段(Opera 搜索栏、Google 搜索栏等),但无法写出这个字符。您只能使用 Alt+0239 组合来编写此内容。您可以尝试使用“field2.setOnKeyPressed()”创建组合。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java