如何解决Scene.getFocusOwner() 从 Scene
我有一个 JavaFX 应用程序。它现在的工作方式是创建一个 GridPane
并调用一个函数,该函数接受一个对象的 Arraylist,其中每个对象由一个 Label
、TextField
和 {{1} } 以该顺序。所述函数将所有这些节点单独添加到 Label
,然后将 GridPane
添加到 GridPane
。在设置 Scene
之前,我尝试在单独的函数中为所有 Stage
对象设置事件处理程序。在那里,我尝试获取光标当前正在等待的 TextField
,以决定 Textfield
将采取什么行动。我尝试在单独的函数中使用 Scene.getFocusOwner 来获取当前选择的 TextField 但它总是返回 Null,当它应该返回一个我可以转换为 Textfield
的对象时(即使在应用程序启动之后)。相关代码如下:
TextField
'setEventEntryHandlers' 函数内部
//How the start function looks
public void start(Stage primaryStage) throws Exception{
primaryStage.setTitle("Warehouse Form");
ArrayList<FormRow> entryRows = new ArrayList<>();
//each array holds same number of Strings
String defLabels[] = {"....","....",....};
String defTextEntry[] = {"....",....};
String defConfLabels[] = {"....",....};
GridPane g = runDefaultForm(entryRows,defLabels,defTextEntry,defConfLabels);
final Scene sc = new Scene(g,500,600);
setEntryEventHandlers(g,sc,primaryStage,entryRows);
primaryStage.setScene(sc);
primaryStage.show();
}
调用Scene.getFocusOwner的函数...
public void setEntryEventHandlers(GridPane g,Scene sc,Stage st,ArrayList<FormRow> formRows){
int row = 0,col = 0;
TextField curTextEntry = null;
TextField nextTextEntry = null;
Label curConfLabel = null;
Label curLabel = null;
//Iterate through every field and set event handler,goes down via row
for(int i = 0; i < fieldsAdded; i++){
curLabel = (Label)getNodeFromGrid(g,i,col);//Gets Label from coordinates
curTextEntry = (TextField) getNodeFromGrid(g,col + 1);//Gets Entry Textfield from Coordinates
nextTextEntry = (TextField)getNodeFromGrid(g,i + 1,col + 1 );//Gets the Next Text Entry from coordinates
curConfLabel = (Label)getNodeFromGrid(g,col + 2);//
//function call that contains Scene.getFocusOwner
TextField tempFocus = getFocusFromGrid(g,formRows,userSelectedCoordinates);
if(tempFocus == null){
System.out.println("TEXTFIELD IS NULL BABY");
}
else{
System.out.println("ALL IS GOOD");
}
.
.
.
}
}
所以调用 Scene.getFocusOwner 总是返回 null,我什至不确定我是否设置了所有这些 uupright 或者我是否可以使用函数调用从 start 函数开始的两个函数(可以这么说)。任何帮助将不胜感激。
解决方法
只需移动 setEntryEventHandlers
以便在显示后调用它:
primaryStage.setScene(sc);
primaryStage.show();
setEntryEventHandlers(g,sc,primaryStage,entryRows);
您正在做的是在 primaryStage 还不是窗口时调用 setEntryEventHandlers,因此焦点将为空。为了获得更好的结果,您应该在 primaryStage.onShown 事件上调用它:primaryStage.setOnShown(e-> setEntryEventHandlers(g,entryRows));
并在设置 onShown 处理程序后显示舞台并且应该可以正常工作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。