代码之家  ›  专栏  ›  技术社区  ›  Crutz

JavaFx聊天文本字段和按钮键侦听器

  •  0
  • Crutz  · 技术社区  · 7 年前

    import javafx.application.Application;
    import javafx.event.EventHandler;
    import javafx.geometry.Insets;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.control.ScrollPane;
    import javafx.scene.control.ScrollPane.ScrollBarPolicy;
    import javafx.scene.control.TextArea;
    import javafx.scene.control.TextField;
    import javafx.scene.input.KeyCode;
    import javafx.scene.input.KeyEvent;
    import javafx.scene.layout.Pane;
    import javafx.scene.layout.StackPane;
    import javafx.scene.layout.VBox;
    import javafx.scene.paint.Color;
    import javafx.stage.Stage;
    
    public class ChatView extends Application {
        String s;
    
        @Override
        public void start(Stage stage){
            s = "";
            StackPane rootPane = new StackPane();
            TextField enterMessageField = new TextField();
            enterMessageField.setEditable(true);
    
    
            TextArea displayAllMessages = new TextArea();   
            displayAllMessages.setPrefHeight(500);
            displayAllMessages.setEditable(false);
            ScrollPane scrollPane = new ScrollPane();
            scrollPane.setContent(displayAllMessages);
            scrollPane.setVbarPolicy(ScrollBarPolicy.ALWAYS);
            displayAllMessages.setPrefWidth(650);
    
            Button button = new Button("Send Message");
    
            VBox vBoxChat = new VBox();
            vBoxChat.setPadding(new Insets(650, 200, 20, 20));
            vBoxChat.getChildren().addAll( enterMessageField);
    
            VBox vBoxChatIncoming = new VBox();
            vBoxChatIncoming.setPadding(new Insets(20, 20, 20, 20));
            vBoxChatIncoming.getChildren().addAll( scrollPane);
    
            VBox vBoxEnter = new VBox();
            vBoxEnter.setPadding(new Insets(650, 20, 20, 550));
            vBoxEnter.getChildren().add(button);
    
    
            rootPane.getChildren().addAll(vBoxChat, vBoxEnter, vBoxChatIncoming);
            Scene scene = new Scene(rootPane, 700, 700, Color.WHITE);
            stage.setScene(scene);
            stage.setTitle("Chat");
            stage.show();
    
    
            enterMessageField.setOnKeyPressed(new EventHandler <KeyEvent> () {
                @Override
                public void handle(KeyEvent event){
    
                    if (event.getCode() == KeyCode.ENTER){
                        s = enterMessageField.getText() + "\n";
                        enterMessageField.setText("");
                        displayAllMessages.appendText(s);
                     }  
    
    
            }
            });
    
            button.setOnAction((event) -> {
                s = enterMessageField.getText() + "\n";
                enterMessageField.setText("");
                System.out.println(s);
                });
    
        }
        public static void main(String[] args){
            launch(args);
    
        }
    }
    

    谢谢你的帮助!

    1 回复  |  直到 7 年前
        1
  •  0
  •   Dmytro Maslenko    7 年前

    我改变了 rootPane GridPane 这个事实解决了问题。

    实际上 StackPane 不适用于多成分界面。请参见此处的类似问题: Mouse Events get Ignored on the Underlying Layer

    请参阅下面稍加改进的代码:

    public class ChatView extends Application {
        String s = "";
    
        @Override
        public void start(Stage stage) {
            TextField enterMessageField = new TextField();
            enterMessageField.setEditable(true);
    
            TextArea displayAllMessages = new TextArea();
            displayAllMessages.setPrefHeight(500);
            displayAllMessages.setEditable(false);
            ScrollPane scrollPane = new ScrollPane();
            scrollPane.setContent(displayAllMessages);
            scrollPane.setVbarPolicy(ScrollPane.ScrollBarPolicy.ALWAYS);
            displayAllMessages.setPrefWidth(650);
    
            Button button = new Button("Send Message");
            button.setDefaultButton(true);
    
            VBox vBoxChat = new VBox(enterMessageField);
            vBoxChat.setPadding(new Insets(10, 10, 10, 10));
    
            VBox vBoxChatIncoming = new VBox(displayAllMessages);
            vBoxChatIncoming.setPadding(new Insets(10, 10, 10, 10));
    
            VBox vBoxEnter = new VBox(button);
            vBoxEnter.setPadding(new Insets(10, 10, 10, 10));
    
            GridPane rootPane = new GridPane();
            rootPane.add(vBoxChatIncoming, 0, 0);
            rootPane.add(vBoxChat, 0, 1);
            rootPane.add(vBoxEnter, 1, 1);
    
            Scene scene = new Scene(rootPane, 800, 700, Color.WHITE);
            stage.setScene(scene);
            stage.setTitle("Chat");
            stage.show();
    
            enterMessageField.setOnKeyPressed(event -> {
                if (event.getCode() == KeyCode.ENTER) {
                    s = enterMessageField.getText() + "\n";
                    enterMessageField.setText("");
                    displayAllMessages.appendText(s);
                }
            });
    
            button.setOnAction((event) -> {
                s = enterMessageField.getText() + "\n";
                enterMessageField.setText("");
                System.out.println(s);
            });
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    }