2014-09-23 2 views
0

Я пишу небольшое приложение, которое использует сканер штрих-кода в качестве входных данных. После некоторого тестирования я остановился на evt.getKeyCode() == KeyEvent.VK_ENTER, чтобы скрыть проверки в БД. Таким образом, пользователь может ввести штрих-код вручную в текстовое поле и нажать клавишу ввода, чтобы отключить проверку БД или использовать сканер, который также автоматически отправляет символ ввода после отправки всех отсканированных символов.java showMessageDialog ввод текста фокус ввода

Если есть проблема со сканированным штрих-кодом, я показываю сообщение об ошибке пользователю, используя JOptionPane.showMessageDialog. Когда пользователь нажимает кнопку ввода, чтобы закрыть диалоговое окно, он снова запускает диалог, как если бы кнопка ввода снова была нажата в текстовом поле. Она переходит в этот цикл, пока пользователь не нажмет кнопку ОК с помощью мыши.

Как я этого избежать ...

есть лучший способ проверить, если сканер полностью отправить все эти символы и начать БД проверку, чем с помощью кнопки ввода

ИЛИ

находится там способ для текстового поля потерять фокус в течение короткого момента, когда диалог показывает и возвращает фокус обратно к нему, когда диалог закрывается (пользователь нажимает на кнопку/нажимает OK/кликает на маленьком «x»).

Мне удалось использовать hasFocus(), чтобы вернуть фокус в текстовое поле, но поскольку у меня только текстовое поле и Jtable на кадре, я немного ограничен. Я попытался настроить фокусировку на Jtable, прежде чем показывать диалог в качестве обходного пути, а затем переориентироваться на текстовое поле, но проблема все еще сохраняется. Даже попытался установить фокус на фрейм, до сих пор не повезло.

любые идеи, пожалуйста?

+1

Если вы покажете свой фрагмент кода, который мы можем запустить сами и увидеть проблему, это будет устранено в незавершенное время ([MCVE] (http://stackoverflow.com/help/mcve)). – user1803551

ответ

0

после нескольких испытаний я нашел альтернативу.

Я сделал простое приложение с текстовым полем.

ранее я имел:

private void jTextField1KeyReleased(java.awt.event.KeyEvent evt) { 
    if(evt.getKeyCode() == KeyEvent.VK_ENTER) { 
     JOptionPane.showMessageDialog(null, "Enter button pressed"); 
    } 
} 

Это приведет к петле диалога показа и закрытия, если кнопка ввода используется, чтобы закрыть диалоговое окно.

Я изменил это:

private void jTextField1KeyPressed(java.awt.event.KeyEvent evt) { 
    if(evt.getKeyCode() == KeyEvent.VK_ENTER) { 
     JOptionPane.showMessageDialog(null, "Enter button pressed"); 
    } 
} 

THis решить эту проблему. Больше нет петли.

Я предполагаю, что кнопка ОК в диалоговом окне нажата на событие Keydown, которое закрывает диалоговое окно, обращает внимание на текстовое поле, затем на несколько миллисекунд, в которых я удерживал клавишу ввода, текстовое поле теперь имеет фокус и таким образом, срабатывает событие KeyReleased, когда я поднимаю палец.

Работы для сканера также.

спасибо за все предложение.

+0

Управление ключевыми событиями напрямую сопряжено с риском (например, зависит от ОС). Подумайте о том, как конвертировать ваше решение, чтобы использовать привязки клавиш, как я продемонстрировал в своем ответе. – user1803551

+0

@ пользователь1803551 ... спасибо за ввод. Я все еще очень новичок в Java. Как через неделю. Так что я все еще чувствую ноги – Shaakir

0

Ваша идея фокуса не будет работать. Но так как вы не опубликовали какой-либо код, все, что я могу предложить, это kludge.

public static class MyKeyListener extends KeyAdapter { 
    private changed = false; 
    public void keyPressed (KeyEvent ke) { 
    if (ke.getKeyCode() == VK.ENTER) { 
     if (changed) runIt(); // submit to db 
    } else { 
     changed = true; 
    } 
    } 
} 
+2

ENTER, запускающее событие (KeyBindings) на JOptionPane, причина для KeyListener (например, поля ввода в стандартном JOptionPane являются JTextFiels, JComboBox и ненавидит KeyListener) – mKorbel

1

Ниже приведен пример использования клавиш:

public class EnterKey extends JFrame { 

    EnterKey() { 

     JPanel base = new JPanel(); 
     base.getInputMap().put(KeyStroke.getKeyStroke("ENTER"), "Scan!"); 
     base.getActionMap().put("Scan!", new ScanAction()); 
     base.getInputMap().put(KeyStroke.getKeyStroke("A"), "Simulate error"); 
     base.getActionMap().put("Simulate error", new ErrorAction()); 

     add(base); 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     pack(); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 

     new EnterKey(); 
    } 

    private class ScanAction extends AbstractAction { 

     @Override 
     public void actionPerformed(ActionEvent e) { 

      //perform scan 
      System.out.println("Scan performed"); 
     } 
    } 

    private class ErrorAction extends AbstractAction { 

     @Override 
     public void actionPerformed(ActionEvent e) { 

      //open error dialog 
      JOptionPane.showMessageDialog(EnterKey.this, "Error", "Bad scan", JOptionPane.ERROR_MESSAGE); 
     } 
    } 
} 

Рама просто держит пустую панель, чтобы получить ключевые события. Нажмите Введите, чтобы начать сканирование, или a, чтобы открыть диалоговое окно с ошибкой. Если вы отпустите диалог с , введите, он не будет инициализировать сканирование , если вы не удерживаете нажатой клавишу (продолжительность зависит от ОС).

Смежные вопросы