簡體   English   中英

Java KeyEvent混亂

[英]Java KeyEvent confusion

我有一個程序,它是一個模擬清單系統,其中包含許多JTextField和一些某些字段必須遵守的正則表達式。 另外,某些字段不能為null(顯然)或為空的String。 為了幫助用戶輸入數據,我添加了一些ImageIcon來顯示輸入數據是有效還是無效。 (綠色復選setVisibility()或紅色x),我通過用戶通過KeyEvents輸入setVisibility()

話雖如此,這就是混亂。 我有一個可以確定沒有錯誤的塊,但是我發現正在發生一些奇怪的事情:

我只調用我的updateIcons()方法來響應keyTyped() -我對其他參數的覆蓋為空。 現在,當鍵入一個鍵時,在釋放該鍵之前會在屏幕上打印該文本,因此您會認為僅需要至少一個字符的輸入字段就永遠不會通過有效性檢查,因為如果keyTyped()是唯一的指向我的updateIcons()方法的入口,到釋放鍵並因此注冊為“鍵入的鍵”時,至少應有一個字符。 但是,似乎在將密鑰注冊到系統之前就觸發了一個事件。 一些東西,使這個更奇怪的是,如果我把我的updateIcons()方法兩次從覆蓋的行keyTyped()方法,該方案仍然不能解決空字符串檢查。 但是,如果我為同一個事件調用keyPressed()keyReleased()keyTyped()都可以; 有效數據。 這可能是由AWT的不穩定性/堅固性引起的嗎?

這是updateIcons()方法,以防萬一我忽略了它,但是由於我得到了如此奇怪的結果,因此我認為這並不是我的錯誤。

//called from keyTyped
//formInputIcons is a 2D array[8][2] where the first dimension represents
//the form input field, and the second dimension is the ImageIcons for that field
//public final Pattern upcRegex = Pattern.compile("^\\d{12}$");
//public final Pattern anyNumRegex = Pattern.compile("^\\d+$"); 

public void updateIcons(KeyEvent e){

    if(e.getSource() == formAddInputs[0]){
        formInputIcons[0][0].setVisible( ! (upcRegex.matcher(
                ((JTextField)e.getSource()).getText()).matches()));
        formInputIcons[0][1].setVisible(upcRegex.matcher(
                ((JTextField)e.getSource()).getText()).matches());

    }else if(e.getSource() == formAddInputs[1]){
        formInputIcons[1][0].setVisible(((JTextField)e.getSource()).getText().equals(""));
        formInputIcons[1][1].setVisible( ! ((JTextField)e.getSource()).getText().equals(""));

    }else if(e.getSource() == formAddInputs[3]){
        formInputIcons[3][0].setVisible(((JTextField)e.getSource()).getText().equals(""));
        formInputIcons[3][1].setVisible( ! ((JTextField)e.getSource()).getText().equals(""));


    }else if(e.getSource() == formAddInputs[4]){
        formInputIcons[4][0].setVisible(((JTextField)e.getSource()).getText().equals(""));
        formInputIcons[4][1].setVisible( ! ((JTextField)e.getSource()).getText().equals(""));


    }else if(e.getSource() == formAddInputs[6]){
        formInputIcons[6][0].setVisible( ! (anyNumRegex.matcher(
                ((JTextField)e.getSource()).getText()).matches()));
        formInputIcons[6][1].setVisible(anyNumRegex.matcher(
                ((JTextField)e.getSource()).getText()).matches());


    }else if(e.getSource() == formAddInputs[7]){
        formInputIcons[7][0].setVisible( ! (anyNumRegex.matcher(
                ((JTextField)e.getSource()).getText()).matches()));
        formInputIcons[7][1].setVisible(anyNumRegex.matcher(
                ((JTextField)e.getSource()).getText()).matches());
     }
}

更新:我是個白痴-如果我僅從keyReleased()調用一次updateIcons() keyReleased()並將keyPressed()keyTyped()保留為空,則它會keyTyped() 我喜歡學習東西。 有人可以解釋為什么keyTyped()在這種用法中有問題,但keyReleased()可以正常工作或發布鏈接嗎?

您需要從keyReleased()調用更新方法。 我已經制作了一個簡單的JTextField ,它每次按下一個鍵時都會輸出鍵及其getText() ,並觀察會發生什么:

keyPressed:c
text:
keyTyped:c
text:
keyReleased:c
text:c

keyPressed:a
text:c
keyTyped:a
text:c
keyReleased:a
text:ca

keyPressed:t
text:ca
keyTyped:t
text:ca
keyReleased:t
text:cat

您可以看到keyTyped()keyPressed()事件未更新JTextField的實際文本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM