当前位置: 首页 > 知识库问答 >
问题:

javafx中文本字段的onAction

充鑫鹏
2023-03-14

我的代码中有JavaFX文本字段,希望在文本字段上为不同的事件添加一个操作。

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

今天,我只在文本字段中写入一些文本后按enter键时得到一个操作。如何添加处理tab press的操作?还有,当文本字段用鼠标点击失去焦点时,该如何反应?

当我读留档应该是可能的:https://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/TextField.html

希望有人能帮我:)

共有2个答案

令狐增
2023-03-14

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

使用“低级”事件处理程序的问题是:(1)理论上,您必须向所有其他控件注册鼠标侦听器;(2) 在所有平台上使用相同的按键进行焦点遍历;(3)如果您要添加需要编程焦点遍历的功能(即您有类似于someOtherControl.requestFocus()的代码),则不会通知您的事件侦听器。

如果文本字段失去焦点,响应的可靠方法是使用其Focus usedProperty()注册侦听器:

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

还请注意,场景有一个焦点所有者属性(focusOwnerProperty),该属性同样可以观察到,并包含对场景中当前具有焦点的节点的引用。您可以将此属性潜在地用于处理将焦点从任何文本字段移开的更通用的侦听器。

董良策
2023-03-14

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

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

只要在文本字段中按下一个键,就会执行此操作。您可能需要检查按下的键是否是特定的键。这可以通过以下方式实现

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

例如如果您使用的是NetBeans或其他IDE,您可以在键入“weightTF”后按autocomplete快捷方式来查看方便的方法,这将显示所有可用的方法。我所说的方法从setOn开始。。。希望有帮助:)

 类似资料:
  • 我在寻找一种方法来放弃我的程序中的一个getter。我有一堆动态创建的文本字段: 下面是getter,我想在这里返回聚焦的TextField 处理程序将接收聚焦字段并调用我的“model”-class中的checkInput()方法。 此刻,它接收到一个由我自己设置的预定义字段。检查答案的代码有效。感谢任何帮助我的人,如果我自己找到了一个方法,我一定会把它贴在这里。

  • 我正在从事一个JavaFX 2.2项目,在使用TextField控件时遇到问题。我想限制用户可以在每个文本字段中输入的字符数。但是,我找不到属性或类似maxlength的东西。Swing中也存在同样的问题,通过这种方式解决了。JavaFX 2.2如何解决这个问题?

  • 我试图限制可以插入JavaFX-8文本字段的字符数:当达到限制时,调用endlinereach()方法。我想根据文本字段的大小(GUI上的可见部分)设置最大字符数。所以我使用的代码是 问题是textfield.getPrefClonCount()无法正常工作。此外,我无法以编程方式设置prefClonCount值,因为每次重新启动程序(而不是在执行期间)时,文本字段的宽度都会发生变化。文本字段是J

  • 我需要一些帮助。我有一个s的。 我想检查值是否发生了变化。如果是,我想知道它是哪个文本字段。我知道我可以使用侦听器来执行此操作,但这只适用于单个侦听器。 我希望它在数组上工作并确定哪个文本字段已更改。 提前感谢!

  • 我想确保用户在JavaFX TextField(0.0.0.0255.255.255.255)中输入有效的IPv4地址,但我似乎找不到任何有效的解决方案。 我尝试了该代码: 但是我连一个数字都打不出来...它似乎只用一个输入就可以工作

  • 如何在JavaFX中设置的宽度? 我试过这个: 但我看不到任何变化。