Требуется реализация метода CallBack - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть корневой экран, который генерирует всплывающее окно, и во всплывающем окне у меня есть просмотр списка с кнопкой на нем, и я хочу обновить текстовое поле в корневом экране и закрыть всплывающее окно при нажатии кнопки во всплывающем окне. Код для всплывающего окна и его контроллера.

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 голосов
/ 13 сентября 2018

В подобных случаях я рекомендую использовать 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();
}
0 голосов
/ 13 сентября 2018
interface Callable {
public void callBackMethod();
}

class Worker {
// Worker gets a handle to the boss object via the Callable interface.
// There's no way this worker class can call any other method other than
// the one in Callable.
public void doSomeWork(Callable myBoss) {
    myBoss.callBackMethod();
    // ERROR!
    //myBoss.directMethod();
}
}

class Boss implements Callable {
public Boss() {
    // Boss creates a worker object, and tells it to do some work.
    Worker w1 = new Worker();
    // Notice, we're passing a reference of the boss to the worker.
    w1.doSomeWork(this);
}
//developer that develop library just call controll the place of calling

public void callBackMethod() {
    System.out.println("What do you want?");
}

public void directMethod() {
    System.out.println("I'm out for coffee.");
}
}

public class Main {

public static void main(String[] args) {

    Boss b = new Boss();
    b.directMethod();

    // write your code here
}
}

это пример кода метода обратного вызова

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...