2013-10-24 34 views
1

我正在JavaFX &場景生成器試圖讓一個按鈕在控制檯中顯示文本(只是爲了看到它的工作),但它沒有響應。我不知道爲什麼它沒有射擊。我的按鈕ID是fx:id="testButton按鈕不會在JavaFX中響應

public class Main extends Application 
{ 
    @FXML // fx:id=testButton 
    final Button testButton = new Button("Test"); 

    private void actionListeners() 
    { 

     testButton.setOnAction(new EventHandler<ActionEvent>() 
     { 

      @Override 
      public void handle(ActionEvent event) 
      {  
       System.out.println("Working"); 
      } 

     }); 
    } 

    @Override 
    public void start(Stage primaryStage) throws IOException 
    { 
     Parent page = FXMLLoader.load(Main.class.getResource("TestFXML.fxml")); 
     Scene scene = new Scene(page); 
     primaryStage.setScene(scene); 
     primaryStage.setTitle("Testing"); 
     primaryStage.show(); 

     actionListeners(); 
    } 

    public static void main(String[] args) 
    { 
     launch(args); 
    } 
+0

你按一下按鈕? – Sage

+0

@Sage是的,沒有發生。我甚至用一個標籤來查看文本是否會改變,但它沒有。 – SpicyWeenie

回答

1

@FXML標籤意味着批註的變量將被FXML發動機來填充。所以你不應該爲該變量調用new Button()

通常有一個獨立的fxml控制器類,它填充@FXML變量和處理程序。請看這裏的示例:https://blogs.oracle.com/jmxetc/entry/connecting_scenebuilder_edited_fxml_to

在您的示例中,您要麼覆蓋FXML創建的變量,要麼未正確設置.fxml文件中的FXML控制器。提供fxml內容來檢查後一種情況。

1

您也可以直接爲按鈕操作註釋處理程序,而不必顯式調用...setOnAction(...)方法。這樣會稍微簡單一些,並刪除了Java AWT/Swing中用於管理事件(例如,您必須)所需的大量樣板代碼。

Oracle中的教程很好的解釋了這一點,但作爲一個簡單的例子,您只需將onAction="#handlingMethod"作爲屬性添加到按鈕中,然後將相應的@FXML public void handlingMethod(ActionEvent evt) {....}添加到控制器。例如:

FXML

<Button onAction="#doATask" text="Do A Tas" />

控制器

@FXML public void doATask(ActionEvent evt) {....}

正如上面提到,你需要確保你的FXML控制器集(聲明它在FXML中對您來說是最簡單的,儘管您可以將其設置爲程序化盟友如果你需要)。使用這種方法,您甚至不需要引用Button對象來處理它,這有助於使代碼更清潔。

這真的很簡單,這就是爲什麼我喜歡Swing或AWT開發之上的JavaFX界限的原因之一。

祝你好運。

  • chooks