#javafx #controller #fxml #scenebuilder
Вопрос:
Я пытаюсь проверить, совпадает ли ввод (в виде нажатий клавиш) от пользователя со строкой textToType
, которая была разбита на массив символов. Проблема в том, что, хотя они оба возвращают одно и то же значение, когда я сравниваю их, это все равно даст результат wrong letter
.
Выход
index splitter [0] returned: t
event.getText returned: t
wrong letter
@FXML
private void detectInputAreaKeyEvent(KeyEvent event) {
char[] splitter = textToType.toCharArray();
System.out.println("index splitter [0] returned: " splitter[0]);
System.out.println("event.getText returned: " event.getText());
if (event.getText().equals(splitter[0])) {
System.out.println("right letter");
}
else {
System.out.println("wrong letter");
}
Комментарии:
1.
event.getText()
является aString
, в тоsplitter[0]
время как является achar
(который автоматически преобразуется в aCharacter
). Поскольку они разные типы, они не могут быть равными. Вы можете сделать илиevent.getText().equals(textToType.substring(0,1))
илиevent.getText().charAt(0) == splitter[0]
и т. Д.2. Еще один неэффективный способ-создать новую строку(разделитель[0])
Ответ №1:
TLDR: вы сравниваете a String
с a char
, поэтому они не равны.
KeyEvent.getText()
возвращает a String
и splitter[0]
является примитивным типом char
.
Так String.equals(...)
как ожидает ан Object
, поэтому, когда вы позвоните
event.getText().equals(splitter[0])
splitter[0]
автоматически привязывается к объекту-оболочке типа Character
. Следовательно, вы сравниваете а String
с а Character
. В String.equals()
документации говорится
Результат является истинным тогда и только тогда, когда аргумент не равен нулю и является строковым объектом …
(мое ударение). Поскольку вы предоставляете Character
экземпляр, а не String
экземпляр, результат equals()
является ложным.
Вы можете исправить это, сравнив вещи одного и того же типа:
if (event.getText().charAt(0) == splitter[0])
или
if (event.getText().equals(textToType.substring(0,1)))
(первый, вероятно, несколько более эффективен).