gpt4 book ai didi

java - 操作按钮不起作用(SceneBuilder JavaFX)

转载 作者:行者123 更新时间:2023-11-30 02:13:31 24 4
gpt4 key购买 nike

我正在尝试使用场景生成器创建的按钮切换场景。

这是我的 Controller 类

public class Controller implements Initializable {

@FXML Button LoginButton;

@FXML private void handleButtonAction(ActionEvent event) throws IOException {

Parent tableViewParent = FXMLLoader.load(getClass().getResource("../FXML/MainMenu.fxml"));
Scene tableViewScene = new Scene(tableViewParent);

Stage window = (Stage) ((Node)event.getSource()).getScene().getWindow();
window.setScene(tableViewScene);
window.show();
}


@Override
public void initialize(URL location, ResourceBundle resources) {


}

还有 FXML

<VBox prefHeight="400.0" prefWidth="640.0" xmlns="http://javafx.com/javafx/9.0.4" xmlns:fx="http://javafx.com/fxml/1" fx:controller="Controllers.Controller">

<MenuBar VBox.vgrow="NEVER" />
<AnchorPane id="login" maxHeight="-1.0" maxWidth="-1.0" prefHeight="-1.0" prefWidth="-1.0" style="-fx-background-color: #ccf2ff #ccf2ff;" VBox.vgrow="ALWAYS">
<children>
<AnchorPane id="login2" layoutX="320.0" prefHeight="371.0" prefWidth="316.0">
<children>
<TextField alignment="TOP_CENTER" layoutX="75.0" layoutY="95.0" promptText="Login">
<effect>
<InnerShadow />
</effect></TextField>
<PasswordField alignment="TOP_CENTER" layoutX="75.0" layoutY="159.0" promptText="Password">
<effect>
<InnerShadow blurType="TWO_PASS_BOX" />
</effect></PasswordField>
<Button layoutX="129.0" layoutY="220.0" mnemonicParsing="false" onAction="#handleButtonAction" text="Button" />

</children>
</AnchorPane>
</children>
</AnchorPane>
<AnchorPane />
</children>
</VBox>

出于某种原因,IntelliJ 显示错误无法解析“handleButtonAction”

onAction="#handleButtonAction"

最佳答案

您可以检索场景(和舞台)及其所属的任何 FXML 元素。您只需执行 anyElement.getScene().getWindow()

public class Controller {

@FXML
Button loginButton;

@FXML
private void handleButtonAction() {

Parent tableViewParent = FXMLLoader.load(getClass().getResource("../FXML/MainMenu.fxml"));
Scene tableViewScene = new Scene(tableViewParent);

// Instead of retrieving the stage by the event's source, you can do it by one of your FXML component.
Stage window = (Stage) loginButton.getScene().getWindow();
window.setScene(tableViewScene);
window.show();
}


@FXML
public void initialize() {
//initialize the field you want here.
}
}

和 FXML:

<VBox prefHeight="400.0" prefWidth="640.0" xmlns="http://javafx.com/javafx/9.0.4" xmlns:fx="http://javafx.com/fxml/1" fx:controller="Controllers.Controller">
<!-- Fabian was right, you forgot this children. -->
<children>
<MenuBar VBox.vgrow="NEVER" />
<AnchorPane id="login" maxHeight="-1.0" maxWidth="-1.0" prefHeight="-1.0" prefWidth="-1.0" style="-fx-background-color: #ccf2ff #ccf2ff;" VBox.vgrow="ALWAYS">
<children>
<AnchorPane id="login2" layoutX="320.0" prefHeight="371.0" prefWidth="316.0">
<children>
<TextField alignment="TOP_CENTER" layoutX="75.0" layoutY="95.0" promptText="Login">
<effect>
<InnerShadow />
</effect>
</TextField>
<PasswordField alignment="TOP_CENTER" layoutX="75.0" layoutY="159.0" promptText="Password">
<effect>
<InnerShadow blurType="TWO_PASS_BOX" />
</effect>
</PasswordField>
<Button fx:id="loginButton" layoutX="129.0" layoutY="220.0" mnemonicParsing="false" onAction="#handleButtonAction" text="Button" />
</children>
</AnchorPane>
</children>
</AnchorPane>
<AnchorPane />
</children>
</VBox>

对您的代码的一些解释/评论。

  • 自 JavaFX 8 起,无法实现 Initializes。现在,使用 FXML 注释的 initialize 方法就足够了(查看 note in interface definition )。
  • 将登录按钮的第一个字母更改为小写 ( Java naming convention )
  • Fabian 的评论是正确的,您忘记了 FXML 中 VBox 节点的子起始元素。
  • 我在您的 FXML 中没有找到 loginButton fx:id。你忘记了吗?我将其添加到 FXML 的 Button 元素中。 (我不知道它是否实际上是登录按钮...)

  • 关于java - 操作按钮不起作用(SceneBuilder JavaFX),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49354362/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com