2017-03-16 92 views
0

我在我的代碼中有JavaFX TextField,並且希望將操作添加到TextField上的不同事件。onAction爲javafx中的textfield

import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.event.EventType; 
import javafx.geometry.Pos; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 
import javafx.scene.control.TextField; 
import javafx.scene.control.Tooltip; 
import javafx.scene.image.Image; 
import javafx.scene.image.ImageView; 
import javafx.scene.layout.*;  
import javafx.scene.text.Font; 
import javafx.stage.FileChooser; 
import javafx.stage.Stage; 
import java.io.File; 
import javafx.beans.value.ChangeListener; 

/* Input from user */ 
    weightTF = new TextField(); 
    weightTF.setMaxWidth(36); 
    activeInsulinTF = new TextField(); 
    activeInsulinTF.setMaxWidth(36); 
    VBox inputBox = new VBox(); 
    inputBox.setFillWidth(false); 
    inputBox.setAlignment(Pos.CENTER); 
    inputBox.getChildren().add(weightTF); 
    inputBox.getChildren().add(activeInsulinTF); 
    inputBox.setSpacing(8); 
    // Add onAction for the texfields 
    menuHBox.getChildren().add(inputBox); 
     weightTF.setOnAction(new EventHandler<ActionEvent>() { 
     @Override 
     public void handle(ActionEvent e) { 
      double weight = Double.parseDouble(weightTF.getText()); 
      Main.state.setWeight(weight); 
      System.out.println("Entered weight: " + weight); 
     } 
    }); 

今天我只有在TextField中寫入一些文本後按Enter鍵時纔會有動作。我怎樣才能添加一個操作來處​​理標籤頁?另外,當TextField在點擊鼠標時失去焦點時如何反應?

當我閱讀文檔,它應該是可能的: https://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/TextField.html

希望有人能幫助我:)

回答

0

有一對夫婦的方便的方法來做到這些,例如

weightTF.setOnKeyPressed(new EventHandler<KeyEvent>() { 
    @Override 
    public void handle(KeyEvent event) { 
     // do stuff 
    } 
}); 

只要在TextField中按下某個鍵就會執行此操作。您可能想檢查按下的鍵是否是特定的鍵。這可以通過以下來實現:

if(event.getCode() == KeyCode.TAB){ 
    // do stuff 
} 

例如。如果您使用的是NetBeans或其他IDE,則可以在鍵入「weightTF」後按下自動完成快捷方式來查看便捷方法,這會顯示所有可用的方法。我在說的方法開始與setOn ... 希望幫助:)

+0

謝謝!你的代碼標籤工作得很好,你讓我在正確的方向來解決它的鼠標東西:)。所以現在一切正常。 – Hanna

+0

@Hanna我猜你的問題,但你需要響應用戶移動焦點到不同的控制。使用這樣的「低級別」事件並不是一個非常可靠的方法。您應該使用文本字段的'focusedProperty'來註冊監聽器。 –

1

它聽起來像你的問題,好像你真的有興趣知道用戶何時將焦點從文本字段移動到另一個控件。如果用戶按選項卡,或者在另一個控件上單擊鼠標,通常會發生這種情況,儘管在技術上這種行爲是依賴於平臺的。它也可以以編程方式發生。

使用「低級別」事件處理程序的問題是(1)理論上,您必須註冊一個鼠標偵聽器,其他控件均爲;所有; (2)您依賴所有平臺上使用的相同擊鍵進行焦點遍歷; (3)如果您要添加需要編程焦點遍歷的功能(即,您在任何地方都有代碼,如someOtherControl.requestFocus()),您的事件偵聽器將不會收到通知。

的安全可靠的方式,如果一個文本字段失去焦點回應是簡單地用其focusedProperty()註冊一個監聽器:

weightTF.focusedProperty().addListener((obs, wasFocused, isNowFocused) -> { 
    if (! isNowFocused) { 
     // text field has lost focus... 
     System.out.println(weightTF.getText()); 
    } 
}); 

還要注意ScenefocusOwnerProperty,這也同樣觀察到的,包含引用當前具有焦點的場景中的節點。您可以使用此屬性替代處理移動焦點遠離任何文本字段的更一般的偵聽器。