2017-11-10 81 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); 
    } 
}