简体   繁体   English

按下按钮并发送消息(Spring Boot 和 Vaadin)

[英]Press the button and send a message (Spring Boot and Vaadin)

I created a chat, it works well.我创建了一个聊天,效果很好。 A message is sent only when I left-click on the "send" button.仅当我左键单击“发送”按钮时才会发送消息。 I want to simplify the use.我想简化使用。 How can I make a message go through the "Enter" button on the keyboard.如何通过键盘上的“Enter”按钮发送消息。 Chat works without errors, everything seems to be fine.聊天工作没有错误,一切似乎都很好。 Only this task remains, how can this problem be solved?只剩下这个任务了,这个问题怎么解决?

在此处输入图片说明

Main view主视图

@StyleSheet("frontend://styles/styles.css")
@Route
@PWA(name = "Vaadin Chat", shortName = "Vaadin Chat")
@Push
public class MainView extends VerticalLayout {
  private final UnicastProcessor<Message> publisher;
  private final Flux<Message> messages;
  private String username;

  @Autowired
  private RestService restService;

  public MainView(UnicastProcessor<Message> publisher,
                  Flux<Message> messages) {
    this.publisher = publisher;
    this.messages = messages;

    addClassName("main-view");
    setSizeFull();
    setDefaultHorizontalComponentAlignment(Alignment.CENTER);

    H1 header = new H1("Vaadin Chat");
    header.getElement().getThemeList().add("dark");

    add(header); 

    askUsername();
  }


  private void askUsername() {
    HorizontalLayout layout = new HorizontalLayout();
    TextField usernameField = new TextField();
    Button startButton = new Button("Start chat");

    layout.add(usernameField, startButton);

    startButton.addClickListener(click -> {
      username = usernameField.getValue();
      remove(layout);
      showChat();
    });

    add(layout);
  }

  private void showChat() {
    MessageList messageList = new MessageList();

    add(messageList, createInputLayout());
    expand(messageList);

    List<Message> lasts = restService.getLast();
    for (Message message : lasts)
      messageList.add(new Paragraph(message.getFrom() + ": " + message.getMessage()));


    messages.subscribe(message -> {
      getUI().ifPresent(ui ->
          ui.access(() ->
              messageList.add(
                  new Paragraph(message.getFrom() + ": " +
                      message.getMessage())
              )
          ));

      restService.saveMessage(message);
    });
  }

  private Component createInputLayout() {
    HorizontalLayout layout = new HorizontalLayout();
    layout.setWidth("100%");

    TextField messageField = new TextField();
    Button sendButton = new Button("Send");
    sendButton.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
    sendButton.addClickShortcut(Key.ENTER).listenOn(messageField);

    layout.add(messageField, sendButton);
    layout.expand(messageField);

    sendButton.addClickListener(click -> {
      publisher.onNext(new Message(username, messageField.getValue()));
      messageField.clear();
      messageField.focus();
    });
    messageField.focus();

    return layout;
  }

}

Starting from Vaadin 13, you can add a click shortcut to the button: someButton.addClickShortcut(someKey) .从 Vaadin 13 开始,您可以向按钮添加单击快捷方式: someButton.addClickShortcut(someKey) To limit the scope of the listener so that it only reacts when the text field has focus, you can supplement it with listenOn .要限制侦听器的范围,使其仅在文本字段获得焦点时做出反应,您可以使用listenOn对其进行listenOn

This is thus what would be needed in your case:因此,这就是您的情况所需要的:

sendButton.addClickShortcut(Key.ENTER).listenOn(messageField);

You can add Enter Key Listener something like this您可以像这样添加 Enter Key Listener

TextField myTextField = new TextField("A text field");
myTextField.setImmediate(true);
OnEnterKeyHandler onEnterHandler=new OnEnterKeyHandler(){
    @Override
    public void onEnterKeyPressed() {
        publisher.onNext(new Message(username, messageField.getValue()));
        messageField.clear();
        messageField.focus();
    }
};
onEnterHandler.installOn(myTextField);

You can see more detail here您可以在此处查看更多详细信息

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM