【发布时间】:2019-08-28 15:02:33
【问题描述】:
我面临的问题是当我有一个输入(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: 我也可以使用下面的代码破解它,但如果我决定这样做,我必须为我所有的 TextFields 这样做,这是我想要的避免。否则我应该创建一个“虚拟”CustomTextField 类,它将扩展 TextField 并在那里实现 hack,然后我可以用 CustomTextField 替换我项目中的所有 TextField 引用。
field2.setTextFormatter(new TextFormatter<>(c -> {
String text = c.getControlNewText();
if (text.contains("¨ι") || text.contains("¨Ι")) {
// In order to "catch" a word with multiple wrong characters
// for example if someone tries to copy/paste, I will use
// the replaceAll() method
text = text.replaceAll("¨ι", "ϊ");
text = text.replaceAll("¨Ι", "Ϊ");
// update the field
field2.setText(text);
// correct the caret and anchor positions
c.setCaretPosition(c.getCaretPosition() - 1);
c.setAnchor(c.getCaretPosition());
c.setText(""); // consume change because we already update it
}
return c;
}));
【问题讨论】:
-
你试过键盘上的
al+0207吗? -
另外,你的 hack 很不错,但在这种情况下建议使用 TextFormatter。
-
@fuggerjaki61 在我的主项目中,我使用编码为 UTF-8 的 FXML 加载所有视图,并且我已经使用 UTF-16 对其进行了测试。我也尝试使用多个字体系列。这不太可能是字体问题,因为否则我将无法像在上面的示例中那样首先“硬编码”这个词。
-
FWIW 有人在 4 年前在 reddit.com/r/javahelp/comments/2y69co/… 遇到了同样的问题,但我在那里没有看到解决方案。这可能是
TextField的错误吗? -
还有!这是一个类似的问题(但针对
JTextField),用户报告说操作系统之间的行为有所不同。 stackoverflow.com/questions/24017029/…