当前位置: 首页 > 知识库问答 >
问题:

Java GUI(使用FXML):

元俊雅
2023-03-14

我正在创建一个应用程序,将FXML和常规javaFX结合起来创建一个应用程序。然而,我在为生成自定义窗口的称为AddItemWindow的阶段子类编写事件处理程序时遇到了问题。

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

然后弹出一个新窗口,用户必须在其中输入相关数据。它将生成一个包含文本字段的网格窗格,用户可以在其中输入数据。这将是一个自定义网格窗格,具体取决于项目类型。然后,它将加载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,舞台*/包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();
    }
}

共有1个答案

蓟安歌
2023-03-14

顶部有FXML private Button btnOK 哪一个好。

要在Java代码中指定按钮的操作,可以在您的buildGUI()方法中使用此Java 8语法(请参阅JavaFX 8事件处理示例):

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

如果未使用Java8,请参阅UI控件示例

您不需要用FXML注释方法。

 类似资料:
  • 我用Java写了Tic-Tac-Toe。我似乎遇到的问题是,当(人类)播放器1和(计算机)播放器2之间出现平局时,GUI会冻结。我已经在“Buttonlistener”类和“Methods”中创建了一个tieCheck,以获得一个平局。 我的程序的工作方式是,当按下一个按钮时,它会将一个值传递给methods类中的数组。在这个数组中,1=玩家1,2=玩家2。 人类玩家总是先走,所以当人类玩家走了4

  • 当我点击一个按钮,JInternalFrame出现,我想迫使用户只能点击那个内部框架(外部框架应该被禁用),就在他关闭内部框架时,他可以使用外框。 我该怎么做?谢谢

  • 我有一个二维数组(矩阵),尺寸为50x50。在这些矩阵中,每个位置的值为 0 或 1。此矩阵由具有 50x50 按钮的网格布局呈现,如果值为 0 或 1,则这些按钮为白色或黑色。如果我按下一个按钮,矩阵中的相关位置应该将值更改为1。为了实现这一点,我为每个矩阵位置创建了一个按钮的网格,由for循环执行。我还为此 for 循环中的每个按钮实现了一个 ActionListener。我尝试使用 Acti

  • 我目前正在处理这段代码,它在主页面之前实现了一个登录页面。代码如下: 因此,仅登录页面就可以工作,使用正确的凭据,我们会得到JOption MessageDialog,证明凭据是正确的。当我尝试在我的主类中实现它时,它会在主框架前面打开,如下所示: 有没有人知道到底需要改变什么才能作为一个整体出现?

  • 我正在经历JavaAWT 例如,在这篇文章中-如何求解三角方程cos(πθ/β)−cos(2πθ/β)=0? 用户给出了一些复杂的方程式,并展示了图形的外观。 但是我们如何为这个等式编写一个Java的程序来生成图形GUI作为输出呢? 有人能给我指一些文档或链接,让我了解如何用Java实现这一点吗? 提前感谢。

  • 我正在开发一个JAVA Gui。 我有一个Jpanel,我可以向它添加一个Jlabel,然后将它拖到面板内的其他地方。然后我可以创建一个新的Jlabel,以此类推。我无法解决的问题是,当创建新的JLabel并将其添加到面板时,面板调用repaint()。现有标签和新JLabel已对齐。添加新标签时,我希望现有标签保留在其位置。 有什么建议吗?谢谢你!

  • 所以在这里,就像这张图片一样,我需要在一个txt文件中显示我拥有的门票的统计信息。在我的文件中,我使用“,”分隔了4个字段,但我不知道如何在GUI中单独显示它们,即,对于Ticket price下的4个字段,我需要显示价格,这是我txt文件中每行的第2部分,对于Ticket Amounts,则是文件中每行的第3部分。那么我该如何向他们展示呢?我已经设置了一个演示它应该是什么样子,对于图片中的每种类

  • 有没有办法在使用 jongo 查询 MongoDB 时添加 ?我发现这样的错误 - '排序超出了 104857600 字节的内存限制,但没有选择加入外部排序。正在中止操作。传递 allowDiskUse:true 可以选择加入,可以通过以下方式阻止,您的聚合看起来像 但据我所知,Jongo 中的类仅将管道应用于自身,然后您可以使用 方法执行。 是否有任何方法可以将该参数传递给mongo而不从Jon