如何在Javafx中自动触发输入密钥

时间:2016-05-16 08:15:56

标签: javafx triggers key textfield enter

现在我正在研究raspberry pi,我在java,javafx平台上编写了一些程序。我只是想告诉你,我只是javafx的初学者。

根据我的意思,我只想在更改文本字段后触发ENTER键。我的程序的工作原理是这样的;

1)我创建了一个masterform fxml,它将所有其他页面指向一个文本字段。

2)我创建了main方法,让我使用键盘输入一些特定的String值,将它们分配给textfield进行页面更改。

3)我有一个桥接java页面,它包含在project中使用的全局变量。首先我将键盘中的值设置为这些全局变量。这些全局变量被创建为stringproperty,用于为任何更改添加actionlistener。

4)然后我将这些全局变量设置为textfield。

5)Textfield表示来自键盘的相关值。但不幸的是我无法转发页面而没有按下输入键。在这种情况下ı想触发这个textfield.But不幸的是我不知道如何触发texfield而不按Enter键因此我决定使用自动触发器输入该文本字段的键。

我只是使用机器人方法;

Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_ENTER);

但它不起作用。因为我第一次将全局变量设置为textfield。它没有定义文本字段的值被更改。它在按下回车键后确定。

那么在获取全局变量的值后如何触发此文本字段。我想传递如何设置页面,我将向您展示我的程序是如何工作的。

我的代码示例是;

主要方法

 public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);

      for (String strBarcode = scanner.nextLine(); !strBarcode.isEmpty(); 
              strBarcode = scanner.nextLine()) {

          if (strBarcode.equals("distribution")){

          Global.G_MOD.set("distribution");
          System.out.println(Global.G_MOD.get());

      }
}}

GlobalVariables.java(桥页)

public class Global{
public static StringProperty G_MOD = new SimpleStringProperty("");
}

我的javafx的MasterController页面

public class masterformController implements Initializable {


@FXML
    public TextField tbxBarcode;

@FXML
    void onchangetbxBarcode(ActionEvent event)  {

if(Global.G_MOD.get().equals("distribution")){

        try {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/puttolightfx/fxml/page1.fxml"));
            Parent rootpage1 = (Parent)loader.load();

            pnPages.getChildren().clear();
            pnPages.getChildren().add(rootpage1);       


         } catch (IOException ex) {
            Logger.getLogger(masterformController.class.getName()).log(Level.SEVERE, null, ex);
        }
}

@Override
    public void initialize(URL url, ResourceBundle rb) {

Global.G_MOD.addListener(new ChangeListener(){
        @Override
            public void changed(ObservableValue observable, Object oldValue, Object newValue) {
                String Newvalue = (String)newValue; 
                tbxBarcode.setText(Global.G_MOD.get());}
        }); 

}


}

所以一切正常,只需要在texfield上显示全局值: Global.G_MOD 时触发文本字段。然后根据全局值全局传递给另一个页面.G_MOD:“发行”

SOLUTION(解决):

我在textfield的监听器上使用线程解决了我的问题。我放弃了自动触发输入键并专注于文本域更改。

我只是决定使用线程来改变textfield listener中的.fxml页面。

Platform.runLater(new Runnable() {
    @Override
    public void run() {
        //if you change the UI, do it here !
    }
});

已编辑代码:

tbxBarcode.textProperty().addListener((ObservableValue<? extends String> observable, String oldValue, String newValue) -> {
            String Newvalue=(String)newValue;
            System.out.println(tbxBarcode.getText());
            Platform.runLater(new Runnable() {
    @Override
    public void run() {
                           if(Global.G_MOD.get().equals("distribution")){

        try {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/puttolightfx/fxml/page1.fxml"));
            Parent rootpage1 = (Parent)loader.load();

            pnPages.getChildren().clear();
            pnPages.getChildren().add(rootpage1);       


         } catch (IOException ex) {
            Logger.getLogger(masterformController.class.getName()).log(Level.SEVERE, null, ex);
        }
}
//                }


    }
});
        });

1 个答案:

答案 0 :(得分:0)

尝试使用

textField.fireEvent(new KeyEvent(KeyEvent.KEY_PRESSED, "", "", KeyCode.ENTER, true, true, true, true));

根据文档

public KeyEvent(EventType<KeyEvent> eventType,
                String character,
                String text,
                KeyCode code,
                boolean shiftDown,
                boolean controlDown,
                boolean altDown,
                boolean metaDown)
Constructs new KeyEvent event with null source and target and KeyCode object directly specified.
Parameters:
eventType - The type of the event.
character - The character or sequence of characters associated with the event
text - A String describing the key code
code - The integer key code
shiftDown - true if shift modifier was pressed.
controlDown - true if control modifier was pressed.
altDown - true if alt modifier was pressed.
metaDown - true if meta modifier was pressed.
Since:
JavaFX 8.0

您可以参考https://docs.oracle.com/javase/8/javafx/api/javafx/scene/input/KeyEvent.html

修改1 您需要确定必须触发Enter键事件的时刻。 例如: 如果您的文本字段允许有限数量的字符,那么您可以通过以下方式添加上述代码:

txtField.textProperty().addListener(new ChangeListener<String>() {

            @Override
            public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {

                if (newValue.length()>30) {
                    txtField.setText(oldValue);
                    txtField.fireEvent(new KeyEvent(KeyEvent.KEY_PRESSED, "", "", KeyCode.ENTER, true, true, true, true));
                }
            }
        });

这只是一个例子。它可以多次触发您的事件,因此您需要编写代码才能触发事件一次。