2014-09-23 223 views
0

我在寫一個使用條形碼掃描器作爲輸入的小應用程序。 經過一些測試後,我在evt.getKeyCode()== KeyEvent.VK_ENTER上解決了對數據庫的檢查。 因此,用戶可以在文本框中手動輸入條形碼,然後按回車鍵以啓動數據庫檢查,或者使用掃描儀,掃描儀在所有掃描的字符發送完畢後也會自動發送輸入字符。java showMessageDialog輸入文本輸入焦點

如果掃描的條形碼有問題,我會向使用JOptionPane.showMessageDialog的用戶顯示一條錯誤消息。當用戶按下輸入按鈕關閉對話框時,它會再次觸發對話框,就好像在文本框中再次按下了輸入按鈕一樣。它會進入該循環,直到用戶用鼠標單擊確定按鈕。

我如何避免這種情況?

有沒有更好的方法來檢查,如果掃描儀完全把所有它的角色,並開始DB檢查比使用回車鍵

OR

在那裏當對話框關閉時用戶按下輸入/點擊確定/單擊'x'時,對話框顯示並返回焦點時,文本框鬆開焦點的一小段時間。

我已經設法使用hasFocus()將焦點返回到文本框,但由於我只有一個文本框和框架Jtable有點有限。在將對話框顯示爲解決方法之前,我嘗試將焦點設置爲Jtable,然後重新將焦點對準文本框,但問題仍然存在。即使試圖把重點放在框架上,仍然沒有運氣。

有什麼想法嗎?

+1

如果您顯示我們可以自行運行並查看問題的代碼段,則可以立即解決([MCVE](http://stackoverflow.com/help/mcve))。 – user1803551 2014-09-23 11:09:31

回答

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"); 
    } 
} 

這解決了這個問題。沒有更多的循環。

我假設在Keydown事件上按下了OK按鈕,這會關閉對話框,將焦點移回到文本字段,然後在幾毫秒內我按住回車鍵,文本框現在具有焦點並且從而在我舉起手指時觸發KeyReleased事件。

適用於掃描儀。

感謝您的所有建議。

+0

直接處理關鍵事件是有風險的(一個是取決於操作系統)。考慮將您的解決方案轉換爲使用鍵綁定,如我在答案中所演示的。 – user1803551 2014-09-23 15:27:38

+0

@ user1803551 ...感謝您的輸入。我對Java仍然很陌生。就像一個星期。所以我仍然溼透我的腳 – Shaakir 2014-09-23 15:31:32

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向JOptionPane發射一個事件(KeyBindings),KeyListener的原因是什麼(例如,標準JOptionPane中的輸入字段是JTextFiels,JComboBox都討厭KeyListener) – mKorbel 2014-09-23 11:01:45

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彈出錯誤對話框。如果您忽略對話框輸入它將不會初始化掃描,除非您保持按住(持續時間取決於操作系統)。