2016-01-28 28 views
3

我是FXML的新手,我正嘗試使用switch爲所有按鈕點擊創建一個處理程序。但是,爲了這樣做,我需要使用和id來獲取元素。我嘗試了以下,但由於某種原因(也許是因爲我在控制器類而不是主要),我得到一個堆棧溢出異常。如何使用ID在JavaFx中獲取元素?

public class ViewController { 
public Button exitBtn; 

public ViewController() throws IOException { 
    Parent root = FXMLLoader.load(getClass().getResource("mainWindow.fxml")); 
    Scene scene = new Scene(root); 

    exitBtn = (Button) scene.lookup("#exitBtn"); 
} 

}

那麼我將如何讓使用它的ID作爲參考的元素(例如按鈕)?

該按鈕的FXML塊是:

<Button fx:id="exitBtn" contentDisplay="CENTER" mnemonicParsing="false" onAction="#handleButtonClick" text="Exit" HBox.hgrow="NEVER" HBox.margin="$x1" />

+0

使用[控制器類](http://docs.oracle.com/javase/8/javafx/api/類比你的控制器類(可能,但不一定,你Application類)其他javafx/fxml/doc-files/introduction_to_fxml.html#controllers) –

+0

你在混合'id'和'fx:id'標籤。 'lookup'基於'id'。 'fx:id'用於注入控制器類。 – Itai

+0

@James_D這是一個控制器類 – Rakim

回答

2

使用一個控制器類,這樣就不需要使用查找。 FXMLLoader將爲您注入字段到控制器。注射是保證initialize()方法之前發生(如果有的話)被稱爲

public class ViewController { 

    @FXML 
    private Button exitBtn ; 

    @FXML 
    private Button openBtn ; 

    public void initialize() { 
     // initialization here, if needed... 
    } 

    @FXML 
    private void handleButtonClick(ActionEvent event) { 
     // I really don't recommend using a single handler like this, 
     // but it will work 
     if (event.getSource() == exitBtn) { 
      exitBtn.getScene().getWindow().hide(); 
     } else if (event.getSource() == openBtn) { 
      // do open action... 
     } 
     // etc... 
    } 
} 

在FXML的根元素指定控制器類:

<!-- imports etc... --> 
<SomePane xmlns="..." fx:controller="my.package.ViewController"> 
<!-- ... --> 
    <Button fx:id="exitBtn" contentDisplay="CENTER" mnemonicParsing="false" onAction="#handleButtonClick" text="Exit" HBox.hgrow="NEVER" HBox.margin="$x1" /> 
    <Button fx:id="openBtn" contentDisplay="CENTER" mnemonicParsing="false" onAction="#handleButtonClick" text="Open" HBox.hgrow="NEVER" HBox.margin="$x1" /> 
</SomePane> 

最後,加載從FXML與

Parent root = FXMLLoader.load(getClass().getResource("path/to/fxml")); 
Scene scene = new Scene(root); 
// etc...  
+0

我想說的是,例如,您定義爲「私人按鈕exitBtn;」的按鈕不是實際的exitBtn。這只是一個按鈕引用。因此,如果另一個按鈕處理程序(即'openBtn')指向相同的方法,那麼該按鈕將'hide()'而不是退出按鈕 – Rakim

+0

否,因爲在那種情況下'if'中的條件將評估爲false 。 (無論如何,Java中的所有對象都可以通過引用進行訪問:如果使用了查找,這在控制器中確實很難,那麼仍然可以引用該按鈕。) –

+0

查看答案的更新是否更清晰。 –