В Java / Swing есть ли путь к юридически «пытаться мутировать в уведомлении»?

StackOverflow https://stackoverflow.com/questions/3599519

Вопрос

Мне было интересно, есть ли какая-то магия, которую я могу использовать, чтобы обойти незарегистрированную величину и допустить 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.?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top