如何创建一个接受参数的FXML处理程序?

时间:2018-01-09 11:29:06

标签: java javafx fxml

我正在使用JavaFXML开发一个小型的假邮件客户端。 它提供了一个Listview,其中包含在txt文件上写入的消息,TextArea可以打印选定的消息和一些按钮。 这是主视图的图像:https://ibb.co/iKN2rm 我已经照顾了"新消息"按钮,它正在启动一个新的FXML视图并且运行良好。

这是" New_Message"的图像。查看:https://ibb.co/hQf5Bm

现在我正试图实施"回复"按钮,它应该启动与之前相同的视图(新消息),但设置在从主视图获取的所有三个TextFields字符串上,例如消息的文本,收件人和消息参数。

新消息按钮处理程序下方:

private void handle_new(ActionEvent event) {
    try {
        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/Client/Resources/new_utente1.fxml"));
        Parent root1 = (Parent) fxmlLoader.load();
        Stage stage = new Stage();
        stage.setTitle("New Message");
        stage.setScene(new Scene(root1));
        stage.show();
    } catch (Exception ecc) {
        System.out.println("ERROR: " + ecc.getMessage());
    }
}

我尝试实现handle_reply方法,但我无法添加参数,因为如果我这样做,FXML文件将无法找到该方法。

在FXML文件的一小部分下面:

<TextArea fx:id = "testo" editable="false" layoutX="283.0" layoutY="53.0" prefHeight="450.0" prefWidth="490.0" promptText="Select a message and it will be displayed here..." />
      <Button id="nuovo" layoutX="46.0" layoutY="521.0" onAction = "#handle_new" mnemonicParsing="false" prefHeight="25.0" prefWidth="173.0" text="New Message" />
      <Button id="reply" layoutX="283.0" layoutY="521.0" onAction = "#handle_reply" mnemonicParsing="false" prefHeight="25.0" prefWidth="132.0" text="Reply" />

我的问题是:如何实现&#34; handle_reply&#34;如前所述的方法? 谢谢

2 个答案:

答案 0 :(得分:0)

不幸的是,使用带参数的处理程序是不可能的。在每种情况下都应使用不同的处理程序。

前一段时间也遇到过这个问题。作为一种解决方案,您可以执行小型重构,以最大限度地减少代码重复。

如果你知道javascript,你可以使用它而不是使用java处理程序:https://docs.oracle.com/javase/8/javafx/api/javafx/fxml/doc-files/introduction_to_fxml.html#scripting

编辑:你也可以查看这个答案:https://stackoverflow.com/a/37902780/5572007(非常相同)

答案 1 :(得分:0)

创建一个Controller类

然后将此课程连接到您的视图

private void handle_new(ActionEvent event) {
    try {
        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/Client/Resources/new_utente1.fxml"));
        Parent root1 = (Parent) fxmlLoader.load();
        CController ctr = fxmlLoader.getController();
        ctr.setLabelText("asdsad");
        Stage stage = new Stage();
        stage.setTitle("New Message");
        stage.setScene(new Scene(root1));
        stage.show();
    } catch (Exception ecc) {
        System.out.println("ERROR: " + ecc.getMessage());
    }
}

并在您的控制器中执行

public class CController implements Initializable {

    @FXML TextArea testo;

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

    public void setLabelText(String text){testo.setText(text);}
}