现在我正在研究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);
}
}
// }
}
});
});
答案 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));
}
}
});
这只是一个例子。它可以多次触发您的事件,因此您需要编写代码才能触发事件一次。