2017-11-10 149 views
0

我是一个初学者,正在与javafx进行一个简单的聊天工作,我已经搜索过类似的问题,并没有找到合适的解决方案。我需要做的第一件事是图形。我的第一个问题是,我的按钮MousEvent侦听器无法正常工作,我只是不能点击按钮。我的第二个问题是,一旦应用程序正在运行,并且我点击了TextField之外的某个位置,我就不能返回并输入新的文本。就像TextField的监听器一样,监听KeyStroke事件不再运行。代码:JavaFx聊天TextField和按钮密钥监听器

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

    } 
} 

谢谢您的帮助!

+0

注意,有一个''为当用户按下输入被触发TextField' onAction'事件。 – fabian

回答

0

我将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); 
    } 
}