试图建立一个" onshowing"在javafx中的Combobox中的ActionEvent

时间:2016-06-06 23:17:18

标签: javafx combobox actionevent

我正在使用Scene Builder构建一个javafx gui,我想要一个ComboBox,其中会发生一些事情" On Showing。"它看起来很简单,但是当我尝试实现它时崩溃了。我创建了一个只有一个组合框的简单版本,它仍然会崩溃。

这是Main.java模块:

package application;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;


public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {
        try {
//          BorderPane root = new BorderPane();
            BorderPane root = (BorderPane) FXMLLoader.load(Main.class.getResource("Comboscreen.fxml"));

            Scene scene = new Scene(root,400,400);
            scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
            primaryStage.setScene(scene);
            primaryStage.show();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

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

这是fxml:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.ComboBox?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.VBox?>

<BorderPane xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.Controller">
   <center>
      <VBox alignment="CENTER" prefHeight="400.0" prefWidth="400.0" BorderPane.alignment="CENTER">
         <children>
            <ComboBox fx:id="ComboTestBox" onAction="#ComboDo" onShowing="#Showaction" prefWidth="150.0" promptText="Testbox" />
         </children>
      </VBox>
   </center>
</BorderPane>

这是控制器:

package application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.ComboBox;

public class Controller {

    @FXML
    public ComboBox<String> ComboTestBox;

    @FXML
    void ComboDo(ActionEvent event) {
        System.out.println(" Option Chosen");

    }

    ObservableList<String> options = 
            FXCollections.observableArrayList(
                "Option 1",
                "Option 2",
                "Option 3"
            );

    @FXML
  void Showaction(ActionEvent event) {
        System.out.println(" TestAction");
    }



    public void initialize() {
    ComboTestBox.setItems(options); 
    }       


}

看起来很简单,但每次都会崩溃。如果我删除&#34; onshowing&#34;行动,它工作得很好。任何建议都值得赞赏,因为我对此很陌生。

1 个答案:

答案 0 :(得分:0)

假设&#34;崩溃&#34;你的意思是它给你一个运行时异常(为了将来参考,请在你的问题中包括stack trace,其中有很多信息可供你诊断问题):

onShowing处理程序是EventHandler<Event>,而不是EventHandler<ActionEvent>,因此您需要:

@FXML
void Showaction(Event event) {
    System.out.println(" TestAction");
}

请注意,如果您未使用Event参数,则可以省略它,FXMLLoader仍然可以映射到正确的处理程序方法:

@FXML
void Showaction() {
    System.out.println(" TestAction");
}

但是,如果包含参数,则它必须是正确的类型。

顺便说一下,你应该使用适当的命名约定,即

@FXML
void showAction(Event event) {
    System.out.println(" TestAction");
}

对FXML文件进行相应的更改。