Scene.getFocusOwner() 从 Scene

我有一个 JavaFX 应用程序。它现在的工作方式是创建一个 GridPane 并调用一个函数,该函数接受一个对象的 Arraylist,其中每个对象由一个 LabelTextField 和 {{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 函数开始的两个函数(可以这么说)。任何帮助将不胜感激。

happy_lele 回答:Scene.getFocusOwner() 从 Scene

只需移动 setEntryEventHandlers 以便在显示后调用它:

primaryStage.setScene(sc);
primaryStage.show();
setEntryEventHandlers(g,sc,primaryStage,entryRows);

您正在做的是在 primaryStage 还不是窗口时调用 setEntryEventHandlers,因此焦点将为空。为了获得更好的结果,您应该在 primaryStage.onShown 事件上调用它:primaryStage.setOnShown(e-> setEntryEventHandlers(g,entryRows)); 并在设置 onShown 处理程序后显示舞台并且应该可以正常工作。

本文链接:https://www.f2er.com/7139.html

大家都在问