2010-10-06 24 views
5

đã thử một vài cách tiếp cận khác nhau nhưng không thành công. Chỉ cần tự hỏi nếu tôi đang thiếu bất cứ điều gì. Tôi có một JSpinner là một thành phần của một widget DateSelector cùng với một Calendar. Tôi đang cố gắng kích hoạt phương thức xác thực nếu người dùng thay đổi bất kỳ văn bản nào trong JSpinner thay vì sử dụng điều khiển Lịch hoặc mũi tên lên và xuống của JSpinner.Java KeyListener không kích hoạt trên JSpinner

Sau đây là các phương pháp khác nhau tôi đã cố gắng:

jSpinner1.addKeyListener(kl); 

jSpinner1.getEditor().addKeyListener(kl); 

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

Bất cứ ai ngoài kia có bất kỳ ý tưởng như những gì tôi đang làm sai? Cảm ơn

CẬP NHẬT Xin lỗi, tôi nên nói rằng tôi đã thêm một ChangeListener vào JSpinnerDateModel được đính kèm với JSpinner. Cũng giống như vậy:

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

Cảm ơn

Frank

Trả lời

2

JSpinners xử lý KeyEvents, nhưng họ kích hoạt ChangeEvents cho thế giới bên ngoài. Thêm một ChangeListener sẽ cho phép bạn thực hiện xác nhận mà bạn muốn.

Xem thêm: Detecting Spinner Value Changes (Java Tutorials)

+0

Xin lỗi vì không bao gồm thông tin này trong câu hỏi ban đầu (tôi đã cập nhật nó ngay bây giờ) nhưng tôi đã có một ChangeListener gắn liền với Mô hình của JSpinner. Điều này bắt bất kỳ thay đổi nào được thực hiện cho giá trị trong JSpinner nhưng chỉ khi người dùng sử dụng các điều khiển JSpinner. Tôi đang cố gắng kích hoạt sự kiện nhấn phím của một KeyListener khi người dùng chỉnh sửa thủ công giá trị của JSpinner thông qua bàn phím. Cảm ơn – Frank

+0

@Frank: Một ChangeListener sẽ kích hoạt bất cứ khi nào người dùng thay đổi giá trị * và tập trung đi * (hoặc nhấn Enter). Bạn nói đúng là nó sẽ không kích hoạt trong khi người dùng đang gõ. –

+0

Vâng, đó là vấn đề tôi đang gặp phải. Đây là một phần của bảng điều khiển thuật sĩ và nếu người dùng chỉ cần chọn ngày và nhấp vào tiếp theo thì tiêu điểm sẽ không bị mất và phương thức xác thực sẽ bị trễ quá. Cảm ơn bạn đã nhập liệu của bạn. Có vẻ phức tạp hơn suy nghĩ đầu tiên. – Frank

11

Nếu bạn muốn vô hiệu hóa chỉnh sửa bàn phím làm điều này:

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

Để nghe cho các sự kiện quan trọng bạn cần phải thêm một người nghe đến trương Văn bản. Điều này phù hợp với tôi:

((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

Vâng, cảm ơn vì điều này. Tôi có điều này như là một lựa chọn cuối cùng nếu tôi có nhưng tôi muốn người dùng có quyền truy cập đầy đủ để chỉnh sửa ngày bằng cách sử dụng các điều khiển hoặc bằng tay thông qua bàn phím. – Frank

+0

Cảm ơn nhưng tôi đã có mã này tại chỗ - Tôi đã cập nhật câu hỏi để hiển thị tất cả mã đang sử dụng. Xin lỗi vì điều đó. – Frank

2

Đây là một thiếu hụt của swing, và theo ý kiến ​​của tôi JSpinner nên làm theo JComboBox trong việc cung cấp quyền truy cập sau vào trường văn bản cơ bản:

JComboBox.getEditor().getEditorComponent() 

Từ đi qua nguồn của J1.7 Tôi thấy bạn có thể đạt được khá nhiều điều tương tự với

JSpinner.getEditor().getComponent(0) 

Do đó bạn có thể "hack" người nghe trong các foll owing way:

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

Rõ ràng điều này phụ thuộc vào việc thực hiện xoay và hoạt động như ở J1.7 nhưng không đảm bảo hoạt động cho các phiên bản khác trong tương lai hoặc quá khứ.

Tận hưởng.

EDIT

hoặc nếu người biên tập là một thể hiện của DefaultEditor, bạn có thể cast nó như vậy và sử dụng 'getTextField()'. Sẽ rất thuận tiện nếu điều này được xác định trong giao diện.

Các vấn đề liên quan