Заполнение текстового поля автозаполнения JavaFX ControlsFX, приводящее к дублированию содержимогоJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Заполнение текстового поля автозаполнения JavaFX ControlsFX, приводящее к дублированию содержимого

Сообщение Anonymous »

Я использовал JavaFX ControlsFX TextFields.bindAutoCompletion() с асинхронными задачами javafx, чтобы заполнить результаты автозаполнения из моей базы данных neo4j после того, как пользователь вводит два символа. Проблема в том, что если пользователь очищает текстовое поле и вводит новые значения для поиска, теперь есть две привязки, поэтому отображаются два всплывающих окна автозаполнения.
Изображение

Мне нужно иметь возможность полностью отвязать текстовое поле от старого списка и привязать его автозаполнение к новый список. Кажется, абстрактный метод, который я использую, dispose() ничего не делает в стандартном классе AutoCompletionBinding?

Код: Выделить всё

    AutoCompletionBinding clientBinding;
private void getClientAutoComplete(TextField clientNameTextField) {
String input = clientNameTextField.getText().toUpperCase();
if (input.length() < 2  && clientBinding != null) {
clientBinding.dispose();
} else if (input.length() == 2) {
var queryTask = SimpleCypher.getClientAutoComplete(input);

queryTask.setOnSucceeded(event -> {
AutoCompletionBinding clientBinding = TextFields.bindAutoCompletion(clientNameTextField, queryTask.getValue());
clientBinding.setOnAutoCompleted(e -> getClientData(e.getCompletion().getId()));
});

// Start the task asynchronously
Thread queryThread = new Thread(queryTask);
queryThread.setDaemon(true); // Set as daemon thread to allow application exit
queryThread.start();
}
}
Вот задача Javafx:

Код: Выделить всё

    public static Task[*]> getClientAutoComplete(String input){
Task task = new Task() {
@Override
protected List call() throws Exception {
List resultClients = new ArrayList();
try (Session session = DatabaseConnection.getSession()) {
Result result = session.run(
"""
MATCH (n:Client)
WHERE toUpper(n.name) CONTAINS $textFieldInput
RETURN n.id AS id
, n.name AS name
, n.phone AS num
""",
Values.parameters("textFieldInput", input));
while (result.hasNext()) {
Record record = result.next();
resultClients.add(
new Client(
record.get("id").asInt(),
record.get("name").asString(),
record.get("num").isNull() ? null : record.get("num").asString()
));
}
}
return resultClients;
}
};
task.setOnFailed(event -> SimpleCypher.handleQueryError(event));
return task;
}
Я считаю, что решение состоит в том, чтобы создать собственный класс, который переопределяет некоторые абстрактные методы AutoCompletionBinding. Но как мне лучше всего реализовать это на основе того, что мне нужно, а именно возможность для пользователя вводить значение, которое запрашивается в базе данных, а затем заполняет текстовое поле, а также удалять любые предыдущие привязки из предыдущего ввода ?
Вот что у меня есть на данный момент для реализации, но я не уверен, что именно мне нужно вложить в реализацию, чтобы она заработала?:

Код: Выделить всё

import java.util.Collection;

import org.controlsfx.control.textfield.AutoCompletionBinding;

import javafx.scene.Node;
import javafx.util.Callback;
import javafx.util.StringConverter;

public class Neo4jAutoCompletionBinding extends AutoCompletionBinding {

protected Neo4jAutoCompletionBinding(Node completionTarget,
Callback suggestionProvider, StringConverter converter) {
super(completionTarget, suggestionProvider, converter);
// TODO Auto-generated constructor stub
}

@Override
public void dispose() {
// TODO Auto-generated method stub

}

@Override
protected void completeUserInput(T completion) {
// TODO Auto-generated method stub

}

}
  • Я пытался удалить предыдущие привязки автозаполнения каждый раз при запуске нового запроса. Но это не сработало, все привязки остались.
  • Я пробовал привязываться к ObservableList, где ObservableList получал результаты запроса задачи Javafx, но привязка никогда не обновлялась, чтобы показать новые добавленные ценности. Он будет привязан к пустому списку и останется таким, несмотря на то, что ObservableList добавит новые значения из базы данных.
Я ожидаю, что смогу чтобы ввести несколько символов, асинхронно обращайтесь к базе данных, чтобы не зависал пользовательский интерфейс. А затем показывать действительные результаты, одновременно устраняя любую предыдущую привязку, чтобы привязки не накладывались друг на друга и не вызывали путаницу, когда пользователь выполняет автозаполнение и автоматически заполняет неправильное значение, потому что фокус приложения был на другом всплывающем окне привязки, как это может можно увидеть на этом изображении:
Изображение


Подробнее здесь: https://stackoverflow.com/questions/790 ... licate-con
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»