2017-03-16 91 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,这也同样观察到的,包含引用当前具有焦点的场景中的节点。您可以使用此属性替代处理移动焦点远离任何文本字段的更一般的侦听器。