2013-11-28 32 views
8

Bir vaadin TextArea'yı kaba bir konsol olarak kullanıyorum. Kullanıcı, enter tuşuna bastığında çalıştırılması gereken komutları girebilir. Bunu TextArea'da bir dinleyici ile belirtmenin bir yolu var mı?Vaad'de enter tuşuna basılması nasıl algılanır TextArea

TextArea textArea = new TextArea(); 
textArea.addTextChangeListener(this); 
textArea.setTextChangeEventMode(TextChangeEventMode.EAGER); 

Ve metin değişikliği etkinliğini işlemek: metin TextArea girildiğini en kısa sürede

@Override 
public void textChange(TextChangeEvent event) { 
    System.out.println(event.getText()); 
} 

Ancak bu tetiklenir

buldum en yakın şey kullanmaktır. Sadece giriş tuşuna basıldığında bilgilendirilmek istiyorum.

cevap

13

Sen textarea kendisinde kısayol tuşları dinleyemiyorum, ancak basit bir çözüm kestirme olarak girdiğiniz bir gönderme düğmesi eklemek ve kullanmak olacaktır: Eğer don' eğer düğmeye kendisini gizleyebilir

Button b = new Button("submit", new Button.ClickListener() { 
    @Override 
    public void buttonClick(ClickEvent event) { 
     // handle your event 
    } 
}); 
layout.addComponent(b); 
b.setClickShortcut(KeyCode.ENTER); 

t öyle istedin:

b.setVisible(false); 

diğer çözüm ShortcutActions ve işleyicileri kullanmak olacaktır buraya açıklandığı gibi: https://vaadin.com/book/-/page/advanced.shortcuts.html

Ancak her iki durumda da, bir TextArea bileşenini kullanırken anahtarın dinlenmesinin çakışmalara neden olabileceğini göz önünde bulundurmalısınız, çünkü TextArea'daki bir sonraki satıra ulaşmak için aynı anahtarı kullanmanız gerekir.

+0

Ne yazık ki bu çözüm artık çalışmıyor. Bakınız: https://github.com/vaadin/framework/issues/4341 – mjjaniec

3

Böyle, TextArea bir ShortcutListener ekleyebilirsiniz:

TextArea textArea = new TextArea(); 
textArea.addShortcutListener(enter); 

Şimdi sadece aşağıdaki gibi bazı ShortcutListener başlatmak zorunda: Bunun için

ShortcutListener enter = new ShortcutListener("Enter", KeyCode.ENTER, null) { 

     @Override 
     public void handleAction(Object sender, Object target) { 
      // Do nice stuff 
      log.info("Enter pressed"); 
     } 
    }; 
+0

Ayrıca, sadece metinleri odaklanmışken dinleyiciyi eklemeyi öneririm. Bunu eklemek için bir odak dinleyici ve bunu kaldırmak için bir bulanıklık dinleyicisi kullanarak bunu yapabilirsiniz. –

0

, biz fayda fonksiyonu aşağıdaki kullanın

/** 
* Perform the specified action when the text field has focus and `ENTER` is pressed. 
* 
* @param tf The {@link com.vaadin.ui.TextField text field} or 
* {@link com.vaadin.ui.TextArea text area) 
* @param action The action to perform 
*/ 
public static void onKeyEnter(AbstractTextField tf, Consumer<AbstractTextField> action) { 
    tf.addFocusListener(event -> { 
     final Registration r = tf.addShortcutListener(
      new ShortcutListener("Enter", KeyCode.ENTER, null) { 

       @Override 
       public void handleAction(Object sender, Object target) { 
        // sender: UI, target: TextField 
        assert target == tf; 
        action.accept(tf); 
       } 
      }); 
     tf.addBlurListener(e -> r.remove()); 
    });   
} 

kullanmak için:

final TextField searchField = new TextField(); // or TextArea 
searchField.setPlaceholder("Search text (ENTER)..."); 
// .. 
onKeyEnter(searchField, tf -> doSearch(tf.getValue())); 
İlgili konular