需要CallBack方法实现

时间:2018-09-13 09:15:42

标签: java javafx

我有一个生成弹出窗口的根屏幕,在弹出窗口中有一个带有按钮的列表视图,我想更新根屏幕中的texfield并在弹出窗口中单击按钮时关闭弹出窗口。弹出代码及其控制器。

POPUP

public void display() throws IOException {
Stage window =new Stage();
        FXMLLoader loader=new FXMLLoader();
        Parent root = loader.load(getClass().getResource("/ProfilePopup.fxml"));
        window.setTitle("Your profile");
        window.setScene(new Scene(root, 400, 500));
        window.show();


    }

PopUPController

public void initialize() {
        listView.setEditable(true);

        listView.setVisible(true);
        listView.setItems(walletModel.myWallets);

        listView.setCellFactory(param -> {
            try {
                return new EditableCell();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        });
        listView.layout();


        addWalletButton.setOnMouseClicked(event -> {
            walletModel.createWallet();
            listView.getFixedCellSize();
            size.setText("Total Wallets:  " + walletModel.walletSize());
        });
        if (walletModel.myWallets.size() == 0) {
            walletModel.initializeWalletData();
            walletModel.myWallets.add(walletModel.initializeWalletData());
        }
        size.setText("Wallet Size " + walletModel.walletSize());
    }
    static class EditableCell extends ListCell<WalletModel.WalletData> {

        private final WalletCellController controller;


        EditableCell() throws IOException {
            FXMLLoader loader = new FXMLLoader(getClass().getResource("/selectButton.fxml"));
            Node graphic = loader.load();
            controller = loader.getController();
            setGraphic(graphic);

        }

        @Override
        protected void updateItem(WalletModel.WalletData item, boolean empty) {


            if (empty) {

                controller.rootView.setVisible(false);

            } else {
                controller.textField.setText(item.getName());
                controller.rootView.setVisible(true);


            }
        }
    }


} 

我希望列表视图上的按钮在单击时更新根屏幕,并且还要关闭弹出窗口。每个列表视图都从下面的walletcellcontroller代码获取图形。 这是我从根屏幕拨打电话的方式。 在根屏幕中创建实例,然后调用 (Popup popup = new Popup();)

public void popupOpen() throws IOException {
        popup.display();


    }

这是列表视图项的代码

public class WalletCellController implements OnClick {
    public Button select;
    public TextField textField;
    public AnchorPane rootView;
    public  void initialize(){
        onMouseClicked();
    }
    public void onMouseClicked() {

        select.setOnAction(closeEvent -> {
            Node source = (Node) closeEvent.getSource();
            Stage stage = (Stage) source.getScene().getWindow();
            stage.close();
        });



}} 

您能在这里告诉我如何将回调用于动作事件吗?我想我需要从POPUP控制器回调到POPup,然后再从POPup回调到根屏幕。 我是Java的新手,所以我不确定它的实现。

2 个答案:

答案 0 :(得分:0)

... $EnvData = [Config]::initialEnvData()

这是call back method

的示例代码

答案 1 :(得分:0)

在这种情况下,我建议使用Dialog,因为它允许您查询并等待用户输入。

示例

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

<?import javafx.scene.control.Dialog?>
<?import javafx.scene.control.DialogPane?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.layout.VBox?>

<Dialog xmlns:fx="http://javafx.com/fxml/1" fx:id="dialog" fx:controller="fxml.DialogController">
    <dialogPane>
        <DialogPane headerText="Choose item!">
            <content>
                <VBox prefWidth="100" spacing="5">
                    <children>
                        <Button text="a" onAction="#choice" maxWidth="Infinity" />
                        <Button text="b" onAction="#choice" maxWidth="Infinity" />
                        <Button text="c" onAction="#choice" maxWidth="Infinity" />
                        <Button text="Cancel" onAction="#cancel" maxWidth="Infinity" />
                    </children>
                </VBox>
            </content>
        </DialogPane>
    </dialogPane>
</Dialog>
public class DialogController {
    @FXML
    private Dialog<String> dialog;

    @FXML
    private void choice(ActionEvent event) {
        Button source = (Button) event.getSource();
        dialog.setResult(source.getText());
        dialog.close();
    }

    @FXML
    private void cancel() {
        dialog.setResult("");
        dialog.close();
    }

}
@Override
public void start(Stage primaryStage) {
    TextField textField = new TextField();
    Button btn = new Button("Choose");
    btn.setOnAction((ActionEvent event) -> {
        Dialog<String> dialog;
        try {
            dialog = FXMLLoader.load(getClass().getResource("/fxml/Dialog.fxml"));
        } catch (IOException ex) {
            throw new IllegalStateException(ex);
        }
        Optional<String> result = dialog.showAndWait();
        if (!result.orElse("").isEmpty()) {
            textField.setText(s);
        }
    });

    VBox root = new VBox(textField, btn);

    Scene scene = new Scene(root);

    primaryStage.setScene(scene);
    primaryStage.show();
}