Нажмите кнопку, когда в текстовом поле ровно 13 символов - PullRequest
2 голосов
/ 11 декабря 2010

У меня есть текстовое поле и кнопка поиска. Если пользователь вводит ровно 13 цифр (штрих-код), тогда я хочу автоматически запустить поиск.

У меня есть DocumentListener в текстовом поле, и я обрабатываю метод insertUpdate, чтобы определить, что было введено 13 цифр. Я мог бы вызвать код поиска непосредственно в этот момент (и он работает), но хотя 13-й символ был набран, он фактически не отображается на экране, пока поиск не завершится.

Я бы предпочел вместо этого нажать кнопку Поиск и попробовал два способа:

DocumentListener dlBarcode = new DocumentAdaptor() {
    public void insertUpdate(DocumentEvent e) {
        String value = jtBarcode.getText();
        if (isBarcode(value)) {
            ActionEvent ae = new ActionEvent((Object)jbSearch,
                             ActionEvent.ACTION_PERFORMED, "");
            Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(ae);
        }
    }
};

Второй должен использовать:

jbSearch.dispatch(ae);

Похоже, что ни один из методов не вызывает триггер ActionListener в jbSearch. Подскажите, пожалуйста, что я делаю не так?

Ответы [ 3 ]

3 голосов
/ 11 декабря 2010

Не пытайтесь программно «нажать» кнопку. Это не давит, так зачем пытаться обмануть ваш код, думая, что это так? Отделение действия от жеста, выполнившего действие, является важным принципом, которому необходимо следовать. По аналогии, подумайте о зажигании на вашем автомобиле. Поворот ключа запускает зажигание. Поэтому, если бы я хотел разработать дистанционный автомобильный стартер, я бы создал механического робота, который физически вставляет и поворачивает ключ, или моя система должна просто сигнализировать о зажигании напрямую?

Просто определите метод, назовите его performSearch или как угодно, и у вас будет ActionListener на кнопке и DocumentListener каждый вызов этого метода самостоятельно.

Одно примечание: не забудьте на самом деле зарегистрировать прослушиватель документов с помощью текстового элемента управления, который вы используете.

2 голосов
/ 11 декабря 2010

Я мог бы вызвать код поиска непосредственно в этот момент (и он работает), но хотя 13-й символ был набран, он фактически не отображается на экране, пока поиск не завершится.

Обернуть вызов поисковым кодом в SwingUtilities.invokeLater (). Это поместит поиск в конец ветки отправки событий, поэтому текстовое поле будет обновлено до начала поиска.

DocumentListener dlBarcode = new DocumentAdaptor() {
    public void insertUpdate(DocumentEvent e) {
        String value = jtBarcode.getText();
        if (isBarcode(value)) {
            SwingUtilities.invokeLater(new Runnable()
            {
                public void run()
                {
                    invokeSearchMethod();
                }
            });
        }
    }
};
0 голосов
/ 12 декабря 2010

предложение camickr об использовании invokeLater странным образом не сработало, поскольку 13-й символ не был нарисован, пока поиск не закончился. Комментарий Марка, предлагающий использовать SwingWorker, добился цели. Мой код DocumentListener теперь выглядит так:

DocumentListener dlBarcode = new DocumentAdaptor() {
public void insertUpdate(DocumentEvent e) {
    String value = jtBarcode.getText();
    if (isBarcode(value)) {
        PerformSearch ps = new PerformSearch(value);
        ps.execute();
    }
}

И мой PerformSearch выглядит так:

class PerformSearch extends SwingWorker<Product, Void> {
private String key = null;
public PerformSearch(String key) {
    this.key = key;
}
@Override
protected Product doInBackground() throws Exception {
    return soap.findProduct(this.key);
}
protected void done() {
    Product p = null;
    try {
         p = get();
    } catch (InterruptedException e) {
    } catch (ExecutionException e) {
    }
    prod = p;
    if (prod != null) {
        ... populate text fields
    }
    else {
        ... not found dialog
    }
}

Спасибо за помощь. Очень ценится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...