В Java / Swing есть ли путь к юридически «пытаться мутировать в уведомлении»?
-
02-10-2019 - |
Вопрос
Мне было интересно, есть ли какая-то магия, которую я могу использовать, чтобы обойти незарегистрированную величину и допустить jtextfield для «попытки мутировать в уведомлении» или другими словами, чтобы установить свой собственный текст, если его слушатель срабатывает.
Для вашей информации я пытаюсь программировать функцию автоматической полной функции, которая возвращает наиболее вероятное совпадение в диапазоне 12 перечислений в ответ на ввод пользователя в jtextfield.
Вот образец кода. Вам придется прожить мой неуклюжий алгоритм, который скрипит результатам. Я подчеркнул код, который производит исключение с комментарием:
jtfElement1.addCaretListener(new CaretListener() {
@Override
public void caretUpdate(CaretEvent e) {
String s = jtfElement1.getText();
int[] attributes = new int[13];
// iterate through each enum
for (BaseEnumAttributes b: BaseEnumAttributes.values()) {
// iterate through the length of the current text in jtfElement1
for (int i = 0; i < s.length(); i++) {
if (s.length() <= b.toString().length()) {
if (b.toString().charAt(i) == s.charAt(i)) {
// increase the number of "hits" noted for that enum
attributes[b.ordinal()] = attributes[b.ordinal()] + 1;
}
}
}
}
int priorC = 0;
int rightC = 0;
// iterate through the "array" of enums to find the highest score
for (int j = 0; j < attributes.length; j++) {
if (attributes[j] > priorC) {
priorC = attributes[j];
rightC = j;
}
}
if (!s.equals("")) {
// assign to b the Enum corresponding to the "array" with highest score
BaseEnumAttributes b = BaseEnumAttributes.values()[rightC];
iController.updateInputElement1String(b.toString());
// THIS TRIGGERS EXCEPTION
jtfElement1.setText(b.toString());
}
}
});
Решение
Вы, вероятно, лучше используете фильтр документа или пользовательский документ.
Ожидается, что другие слушатели, как ожидается, если документ не останется прежними для отправки событий?
Другие советы
Используйте Handutitivities.invokelater () Размещение всех модификаций там
Возможно, вы можете задержать Settext () с потоком для запуска после завершения CarEupdate ().
Я нашел в той же проблеме, но я нашел простое решение:
Заблокируйте CarEtUpdate () логией, если (false) пока вы устанавливаете текст на jtextfield, чем разблокировать его после. Отказ что-то вроде этого:
Boolean Caret = True;
Частная пустота ListValueChanged (javax.swing.event.lisselectionevent EVT) {Caret = false; name.settext (строка) list.getSelecatedValue ()); Caret = True; }
private void nameCaretUpdate(javax.swing.event.CaretEvent evt) {
if(caret){
model = new DefaultListModel();
this.fillList(name.getText());
list.setModel(model);
}
}
Создайте пользовательский документ и переопределить INSERTSTRING ()
filenameText = new JTextField(new FilenameDocument(), "", 0);
...
/**
* document which adds .xml extension if not specified
*
*/
private class FilenameDocument extends PlainDocument {
@Override
public void insertString(int offset, String insertedText, AttributeSet set)
throws BadLocationException {
if (offset == 0) {
insertedText = insertedText.trim( );
}
super.insertString(offset, insertedText, set);
if (filenameText != null) {
final int caretPos = filenameText.getCaretPosition();
String text = filenameText.getText().trim();
if (text.indexOf('.') == -1) {
filenameText.setText(text + ".xml");
filenameText.setCaretPosition(caretPos);
}
}
}
}
Обратите внимание, что вызывающий Settext приведет к рекурсивному вызову в InservString (), поэтому убедитесь, что у вас есть состояние остановки.
Я удивлен, никто не ответил на это, но бы вам не было лучше реализации редактируемого Jspinner. с А. SpinnerListmodel.?