javafx中文本字段的onAction

Posted

技术标签:

【中文标题】javafx中文本字段的onAction【英文标题】:onAction for textfield in javafx 【发布时间】:2017-03-16 07:55:13 【问题描述】:

我的代码中有 JavaFX TextField,并希望为 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

希望有人可以帮助我:)

【问题讨论】:

【参考方案1】:

有几个方便的方法可以做到这一点,例如

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 开始的... 希望有所帮助:)

【讨论】:

谢谢!!您的选项卡代码效果很好,您让我朝着正确的方向解决鼠标问题:)。所以现在一切正常。 @Hanna 我从您的问题中猜测,尽管您需要响应用户将焦点移动到不同的控件。使用像这样的“低级”事件并不是一种非常可靠的方法。您应该使用文本字段的focusedProperty 注册一个侦听器。【参考方案2】:

您的问题听起来好像您真的很想知道用户何时将焦点从文本字段移动到另一个控件。如果用户按下 Tab 或在另一个控件上单击鼠标,通常会发生这种情况,尽管从技术上讲,这种行为是依赖于平台的。它也可以以编程方式发生。

使用“低级”事件处理程序的问题是(1)理论上您必须向所有其他控件注册鼠标侦听器; (2) 您依赖在所有平台上使用的相同击键来进行焦点遍历; (3) 如果您要添加需要程序化焦点遍历的功能(即您在任何地方都有someOtherControl.requestFocus() 之类的代码),您的事件侦听器将不会收到通知。

如果文本字段失去焦点,可靠的响应方式是简单地使用其focusedProperty() 注册一个侦听器:

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

还要注意Scene 有一个focusOwnerProperty,它同样是可观察的,并且包含对场景中当前具有焦点的节点的引用。您可能会将此属性用于更通用的侦听器,以处理将焦点从任何文本字段移开。

【讨论】:

以上是关于javafx中文本字段的onAction的主要内容,如果未能解决你的问题,请参考以下文章

JavaFX:如何从 GridPane 中动态创建的文本字段的值计算平均值?

在javaFX中实时格式化价格文本字段

从文本字段中提取空数据。表已填充,但无法检索对象。 Java/JavaFX

JavaFX 动态添加新的文本字段

JavaFX 文本字段 CSS

如何使用 JavaFX 将选择框、复选框和文本字段实现为一个按钮 [关闭]