Преобразуйте код уведомления о предупреждении JFoenix JFXDialogLayout в более простую форму, чтобы его можно было повторно использовать для других классов - PullRequest
0 голосов
/ 03 июня 2018

как я могу реорганизовать следующий код, чтобы изменился только код в deleteButton.setOnAction(deleteEvent -> {//only this code varies}.Все остальное останется прежним, но блок кода в лямбда-выражении время от времени меняется, когда я вызываю класс из другого класса.Предполагается, что блок кода, который проходит через лямбда-выражение, является пустым методом.

public class A {    

    public void test() {
        // ensure that user can't close the alert
        Stage primaryStage = (Stage) RootLayoutController.getRootLayout().getScene().getWindow();
        JFXAlert<javafx.scene.control.ButtonType> alert = new JFXAlert<>(primaryStage);
        alert.initModality(Modality.APPLICATION_MODAL);
        alert.setOverlayClose(false);

        //create font awesome icon
        String ICON = "\uf071";
        Label labelIcon = new Label(ICON); 
        labelIcon.setStyle("-fx-font-family: 'FontAwesome'; -fx-font-size: 60px; -fx-text-fill: #D34336;");
        labelIcon.setPadding(new Insets(0,5,0,0));

        // Create the content of the JFXAlert with JFXDialogLayout
        JFXDialogLayout layout = new JFXDialogLayout();
        Label labelHeading = new Label("Alert Notification");
        Label labelBody = new Label("Are you sure you want to delete this?");
        layout.setHeading(labelHeading);
        layout.setBody(new VBox(new HBox(labelIcon, labelBody)));

        // Buttons get added into the actions section of the layout.
        JFXButton deleteButton = new JFXButton("Delete");
        deleteButton.setDefaultButton(true);
        deleteButton.setOnAction(deleteEvent -> {
            //only this block of code changes

            alert.hideWithAnimation();
        });

        JFXButton cancelButton = new JFXButton("Cancel");
        cancelButton.setCancelButton(true);
        cancelButton.setOnAction(closeEvent -> alert.hideWithAnimation());

        layout.setActions(deleteButton, cancelButton);
        alert.setContent(layout); 
        alert.showAndWait();      
    }
}

1 Ответ

0 голосов
/ 03 июня 2018

Из вашего вопроса не совсем ясно, что вы пытаетесь достичь, но я сделаю это с умом.

Если вы хотите передать блок кода на deleteButton.setOnAction() метод, вы можете использовать Interface и передавать реализации этого интерфейса классу A.Затем просто передайте эту ссылку внутреннему методу для onAction лямбды.

Вот очень быстрый пример того, как вы можете сделать что-то вроде этого:

Main.java:

public class Main extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {

        // Action button
        Button btnDoSomething = new Button("Do something...");
        btnDoSomething.setOnAction(e -> doTheThings(new ImplDoSomething()));

        Button btnDoSomethingElse = new Button("Do something else...");
        btnDoSomethingElse.setOnAction(e -> doTheThings(new ImplDoSomethingElse()));

        VBox mainPane = new VBox(5);
        mainPane.setAlignment(Pos.CENTER);
        mainPane.setPadding(new Insets(10));
        mainPane.getChildren().addAll(btnDoSomething, btnDoSomethingElse);

        primaryStage.setScene(new Scene(mainPane));

        primaryStage.show();

    }

    private void doTheThings(IParameterMethod parameterMethod) {

        parameterMethod.call();

    }
}

Интерфейс IParameterMethod.java:

public interface IParameterMethod {

    void call();

}

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

ImplDoSomething.java

public class ImplDoSomething implements IParameterMethod {

    @Override
    public void call() {
        System.out.println("Doing something!");
    }
}

ImplDoSomethingElse.java:

public class ImplDoSomethingElse implements IParameterMethod {

    @Override
    public void call() {
        System.out.println("Doing something else!");
    }
}

Это должно быть легко адаптировано для вашего проекта.

...