2010-10-06 72 views
5

嘗試了幾種不同的方法,但迄今尚未取得成功。只是想知道我是否缺少任何東西。我有一個JSpinner,它是DateSelector小部件和Calendar的組件。如果用戶更改了JSpinner中的任何文本,而不是使用Calendar控件或JSpinner上下箭頭,我試圖激發驗證方法。Java KeyListener未在JSpinner上觸發

以下是我已經嘗試了不同的方法:

jSpinner1.addKeyListener(kl); 

jSpinner1.getEditor().addKeyListener(kl); 

((JSpinner.DefaultEditor) jSpinner1.getEditor().getTextField().addKeyListener(kl); 

任何人在那裏有任何想法,我做錯了嗎?由於

UPDATE 道歉,我應該說我已經添加一個ChangeListener其連接到的JSpinner的JSpinnerDateModel。像這樣:

ChangeListener changeListener = new ChangeListener() { 
     @Override 
     public void stateChanged(ChangeEvent e) { 
      dateChanged(); 
     } 
    }; 

    jSpinnerDateModel.addChangeListener(changeListener); 

    KeyListener keyListener = new KeyListener() { 

     @Override 
     public void keyTyped(KeyEvent e) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void keyPressed(KeyEvent e) { 
      System.out.println(e.getKeyChar()); 
      dateChanged(); 
     } 

     @Override 
     public void keyReleased(KeyEvent e) { 
      // TODO Auto-generated method stub 

     } 

    }; 
    ((JSpinner.DefaultEditor) jSpinner1.getEditor()).getTextField().addKeyListener(
      keyListener); 

感謝

弗蘭克

回答

2

JSpinners自己處理KeyEvent,但它們將ChangeEvents觸發到外部世界。添加一個ChangeListener應該允許你執行你想要的驗證。

參見:Detecting Spinner Value Changes (Java Tutorials)

+0

在原始問題中沒有包含這個信息的道歉(我現在已經更新了),但是我已經有了一個連接到JSpinner模型的ChangeListener。這會捕獲對JSpinner中的值所做的任何更改,但僅當用戶使用JSpinner控件時纔會發生更改。我試圖在用戶通過鍵盤手動編輯JSpinner的值時觸發KeyListener的按鍵事件。謝謝 – Frank 2010-10-06 15:19:42

+0

@Frank:每當用戶改變數值*並聚焦*(或按下Enter)時,ChangeListener應該會觸發。儘管如此,你說得對,它在用戶輸入時不會觸發。 – 2010-10-06 15:36:37

+0

是的,這是我遇到的問題。這是一個嚮導面板的一部分,如果用戶只是簡單地選擇一個日期然後點擊下一步,那麼焦點不會丟失,驗證方法的激發時間太晚。無論如何感謝您的輸入。似乎比首先想到的更棘手。 – Frank 2010-10-06 15:50:00

11

如果要禁用鍵盤編輯做到這一點:

JFormattedTextField tf = ((JSpinner.DefaultEditor)spinner.getEditor()).getTextField(); 
tf.setEditable(false); 

要聽,你需要一個監聽器添加到關鍵事件文本域。這適用於我:

((JSpinner.DefaultEditor)spinner.getEditor()).getTextField().addKeyListener(new KeyListener(){ 

      @Override 
      public void keyPressed(KeyEvent e) {      
      } 

      @Override 
      public void keyReleased(KeyEvent e) { 
       System.out.println("PRESSED!");      
      } 

      @Override 
      public void keyTyped(KeyEvent e) {      
      } 

     }); 
+0

是的,謝謝你。如果需要,我將此作爲最後一個選項,但我寧願用戶可以完全訪問使用控件編輯日期或通過鍵盤手動編輯日期。 – Frank 2010-10-06 15:07:18

+0

謝謝,但我已經有了這個代碼 - 我已經更新了問題,以顯示所有正在使用的代碼。對於那個很抱歉。 – Frank 2010-10-06 15:22:12

2

這是搖擺的短缺,而在我看來的JSpinner應遵循的JComboBox中提供下列訪問底層的文本字段:

JComboBox.getEditor().getEditorComponent() 

從通過源去J1.7我發現你可以acheive幾乎與

JSpinner.getEditor().getComponent(0) 

同樣的事情,因此,你可以在FOLL「黑客」監聽器虧欠的方式:

JSpinner.getEditor().getComponent(0).addKeyListener(...) 

顯然,這取決於「在幕後」執行迴轉的,並可作爲在J1.7,但不保證該工程的其他版本,將來或過去。

享受。

編輯

,或者如果編輯器是DefaultEditor的一個實例,你可以將它轉換爲這樣和使用「getTextField()」。如果這是在界面中定義的,那將很方便。