【问题标题】:Java GUI (using FXML):Java GUI(使用 FXML):
【发布时间】:2016-05-29 15:52:17
【问题描述】:

我正在创建一个应用程序,我将 FXML 和常规 javaFX 结合起来创建一个应用程序。但是,我在为一个名为 AddItemWindow 的 Stage 子类编写 EventHandlers 时遇到了问题,该子类会生成自定义窗口。

该应用程序显示库存中的物品(钥匙和武器)列表。用户可以添加物品,需要按一个按钮来添加他选择的物品(添加钥匙或添加武器)。

然后会弹出一个新窗口,用户必须在其中输入相关数据。它将生成一个带有 TextFields 的 GridPane,用户可以在其中输入数据。这将是一个自定义 GridPane,具体取决于 ItemType。然后它将加载 FXML 并添加 GridPane。

使用下面的代码,我的 SetOnAction 代码的 LoadExceptions 用于取消窗口或确认新项目的按钮。

有人知道我在哪里出错了吗?

/* 启动类*/ 主包;

//imports from javafx and java
import domain.DomainController;
import gui.OverviewWindow;

public class StartUpGUI extends Application {

    @Override
    public void start(Stage primaryStage) {
        Parent root = new OverviewWindow(new DomainController());

        Scene scene = new Scene(root);

        primaryStage.setTitle("Weapons and Keys");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String... args) {
        Application.launch(StartUpGUI.class, args);
    }

}

/* OverviewWindow,BorderPane 的子类 */ 包 gui;

//imports from javafx and java
import domain.DomainController;
import domain.ItemType;

public class OverviewWindow extends BorderPane{

    @FXML
    private Button btnAddWeapon;
    @FXML
    private Button btnAddKey;
    @FXML
    private TextArea txaOverview;

    private DomainController dc;

        this.dc = dc;

        FXMLLoader loader = new FXMLLoader(getClass().getResource("OverviewWindow.fxml"));
        loader.setRoot(this);
        loader.setController(this);
        try{
            loader.load();
            txaOverview.setText(dc.showOverview()); // showOverview returns a String containing a toString of all items in the inventory
        }
        catch (IOException ex){
            throw new RuntimeException(ex);
        }
    }

    @FXML
    public void btnAddWeaponOnAction(ActionEvent event){
        try{
            add(ItemType.WEAPON); // ItemType is an Enum where all the properties of the items are defined; for Weapon: name, weight, level, power, used(boolean)
        }
        catch (Exception e){
            throw e;
        }
    }

    @FXML
    public void btnAddKeyOnAction(ActionEvent event){
        try{
            add(ItemType.SLEUTEL); // ItemType is an Enum where all the properties of the items are defined; for Key: name, weight, level, door
        }
        catch (Exception e){
            throw e;
        }
    }

    private void add(ItemType itemType){
        Stage stage = new Stage();
        stage.setTitle(itemType== VoorwerpSoort.WEAPON ? "Add Weapon" : "Add Key");
        AddItem addItem = new AddItem(dc,itemType,this);

        addItem.setOnHiding(new EventHandler<WindowEvent>(){
            @Override
            public void handle(WindowEvent e){
                txaOverview.setText(dc.showOverview()); // when we close the AddItemWindow, we will update the item overview by having the domain controller get this data from the repository
            }
        });

        addItem.show();
    }
}

/* AddItemWindow,Stage的子类*/ 包 gui;

// import relevant javafx and java classes
import domain.DomainController;
import domain.ItemType;

public class AddItemWindow extends Stage {

    @FXML
    private BorderPane addRoot;
    @FXML
    private Button btnOK;
    @FXML
    private Button btnCancel;

    private DomainController dc;
    private ItemType itemType;
    private Parent parent;

    private TextField[] txfAttributes;

    public AddItemWindow(DomainController dc, ItemType itemType, OverviewWindow overviewWindow){
        this.dc = dc;
        this.itemType = itemType;
        this.parent = overviewWindow;
        this.setScene(buildGUI(dc,itemType,overviewWindow));
    }

    private Scene buildGUI(DomeinController dc, VoorwerpSoort vwps, OverzichtSchermController ovsController){
        Parent root = new BorderPane();

        GridPane properties = new GridPane();

        properties.setPadding(new Insets(10));
        properties.setHgap(10);
        properties.setVgap(10);

        ColumnConstraints col1 = new ColumnConstraints();
        col1.setHalignment(HPos.RIGHT);
        ColumnConstraints col2 = new ColumnConstraints();
        properties.getColumnConstraints().addAll(col1, col2);

        String[] attributes = itemType.attributeNames();
        txfAttributes = new TextField[attributes.length];

        for(int i = 0; i<attributes.length; i++){
            properties.add(new Label(attributes[i]),0,i);
            properties.add(txfAttributes[i] = new TextField(),1,i);
        }

        ((BorderPane) root).setCenter(properties);

        FXMLLoader loader = new FXMLLoader(getClass().getResource("AddItemWindow.fxml"));
        loader.setRoot(root);
        loader.setController(root);
        try{
            loader.load();
            return new Scene(root);
        }
        catch(IOException e){
            throw new RuntimeException(e);
        }
    }


    // NOT WORKING
    @FXML
    public void btnOKOnAction(){
        addItem();
    }

    // NOT WORKING
    @FXML
    public void btnCancelOnAction(ActionEvent event){
        hide();
    }

    private void voorwerpToevoegen(){ // we're calling the domaincontroller to add the new item to the repository
        switch (itemType)
        {
    // for the item, add an item by getting the value of each TextField, which are the
    // parameters for a constructor of the new item           
            case WEAPON:
                dc.addWeapon(txfAttributes[0].getText(),
                    Double.parseDouble(txfAttributes[1].getText()),
                    Integer.parseInt(txfAttributes[2].getText()),
                    Integer.parseInt(txfAttributes[3].getText()),
                    Boolean.parseBoolean(txfAttributes[4].getText()));
                break;
            case KEY:
                dc.addKey(txfAttributes[0].getText(),
                    Double.parseDouble(txfAttributes[1].getText()),
                    Integer.parseInt(txfAttributes[2].getText()),
                    Integer.parseInt(txfAttributes[3].getText()));
                break;
        }
        hide();
    }
}

【问题讨论】:

  • 编辑:AddItemWindow 类中的私有方法 voorwerpToevoegen() 应称为 addItem()。翻译监督...另外:如果我省略 AddItemWindow 按钮的代码,OverviewWindow 上的按钮可以正常工作。

标签: java fxml fxmlloader


【解决方案1】:

在顶部有@FXML private Button btnOK;,这很好。

要在 Java 代码中指定按钮的操作,您可以在 buildGUI() 方法中使用此 Java 8 语法(请参阅 JavaFX 8 Event Handling Examples):

 btnOK.setOnAction((event) -> addItem());

如果您使用的不是 Java 8,请参阅 UI Control Sample

您不需要带有@FXML 注释的方法。

【讨论】:

    猜你喜欢
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多