2015-11-24 2 views
3

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

package application; 

import javafx.geometry.Pos; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 
import javafx.scene.layout.HBox; 
import javafx.scene.layout.VBox; 
import javafx.stage.*; 

/** 
    * An Alert Box for the GUI 
    * to display errors to the user. 
    * 
    */ 
public class AlertBox 
{ 
Stage window; 

public boolean display(String title, String message) 
{  
    boolean cancel = false; 

    window = new Stage();                // Create the stage.   

    window.initModality(Modality.APPLICATION_MODAL);         // If window is up, make user handle it. 
    window.setTitle(title); 
    window.setMinHeight(350); 
    window.setMinWidth(250); 

    VBox root = new VBox();     // Root layout. 

    Label warning = new Label(message);  // Message explaining what is wrong. 

    HBox buttonLayout = new HBox();   // The yes and cancel button. 

    Button yesButton = new Button("Yes"); // Yes button for the user. 
    Button noButton = new Button("No");  // No button for the user. 

    yesButton.setOnAction(e -> 
    { 
     cancel = false; 
    }); 

    noButton.setOnAction(e -> 
    { 
     cancel = true; 
    }); 
    buttonLayout.getChildren().addAll(yesButton, noButton); 


    root.getChildren().addAll(warning, buttonLayout); 
    root.setAlignment(Pos.CENTER); 

    Scene scene = new Scene(root); 
    window.setScene(scene); 
    window.show(); 
} 

/** 
* Closes the window and returns whether the user said yes or no. 
* @param variable 
* @return 
*/ 
private boolean close(boolean variable) 
{ 
    window.close(); 
    return variable; 
} 

}

Я хочу, чтобы мой класс GUI, чтобы точно знать, что произошло, когда пользователь был в классе AlertBox. Пользователь нажал кнопку «Да» или «Нет»? Поэтому я подумал о том, чтобы сделать метод отображения логическим. Здесь проблема заключается в том, что мое выражение прослушивателя событий не может возвращать какие-либо значения, поскольку оно находится внутри обратного вызова типа void. Затем я подумал: «О, я просто сделаю метод close верным логическим». Но потом я вспомнил, что исходная функция, которую я назвал был:

AlertBox warning = new AlertBox; 
boolean userWantsToDelete = warning.display("Warning!", "You are about to delete your account. Are you sure you would like to do this?"); 

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

+0

Это близко к дубликата: [Block выполнение программы до тех пор, пока пользователь не нажмет кнопку] (http://stackoverflow.com/questions/23121580/block-program-execution-until-user-clicks-button) – jewelsea

+0

Это не отвечает на ваш вопрос, но как насчет прохождения интерфейса EventHandler для отображения метода? – Tomasz

+0

* На самом деле было бы лучше установить его в своем классе перед вызовом метода 'display'. – Tomasz

ответ

5

Вы можете использовать оповещения JavaFX для выполнения вашей задачи легко:

Alert alert = new Alert(Alert.AlertType.CONFIRMATION); 
    alert.setTitle("Confirmation Dialog"); 
    alert.setHeaderText("Warning !"); 
    alert.setContentText("Are you sure you want to perform this action ?"); 

    Optional<ButtonType> result = alert.showAndWait(); 
    if (result.get() == ButtonType.OK) { 
    // delete user 
} 

result.get() возвращает логическое значение. Таким образом, вы можете проверить, нажал ли пользователь ButtonType.OK или ButtonType.CANCEL, сравнив его в условии if.

Вот пример для вас, чтобы понять: enter image description here

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

ButtonType buttonTypeOne = new ButtonType("One"); 
ButtonType buttonTypeTwo = new ButtonType("Two"); 
ButtonType buttonTypeThree = new ButtonType("Three"); 

и добавить их в боевой готовности:

alert.getButtonTypes().setAll(buttonTypeOne, buttonTypeTwo, buttonTypeThree); 

Таким образом, вы можете проверить, какая кнопка была нажата с помощью пользователь

Optional<ButtonType> result = alert.showAndWait(); 
if (result.get() == buttonTypeOne){ 
    // ... user chose "One" 
} else if (result.get() == buttonTypeTwo) { 
    // ... user chose "Two" 
} else{ 
    // ... user chose "Three" 
} 
+0

Прости, боюсь, я этого не понимаю. Являются ли эти команды JavaFX? .setContentText, .setHeaderText, .showAndWait() и т. д.? Что означает дополнительный ? – Hatefiend

+1

@Hatefiend да, он использует класс JavaFX Dialog. – crigore

+0

Как бы вы это сделали, не используя класс Dialog? Должен быть способ сделать это, используя мои собственные классы. – Hatefiend

2

Вы можете добавить изменяемый объект (MutableBool класса) в качестве передаваемого параметра. Поскольку Mutable Object передается как указатель, вы можете назначить значение для проверки метода.

Добавить класс:

class MutableBool{ 
    private boolean value; 

    public void setValue(boolean value) { 
     this.value = value; 
    } 

    public boolean getValue() { 
     return value; 
    } 
    } 

и некоторые изменения для вашего кода:

public boolean display(String title, String message, MutableBool answer){ 
    ... 
    answer.setValue(true); 
} 
+0

Итак, я бы сделал так: 'boolean variable = false' (предположим, что пользователь скажет« нет »). 'AlertBox warning = new AlertBox();' 'warning.display (« Предупреждение »,« Будьте осторожны! », Переменная);« Тогда в методе отображения, если я изменю значение 'variable', он также будет отображаться в мой класс GUI? Я не знал, что примитивные типы проходят по ссылке. – Hatefiend

+2

Это не сработает. Булевы классы неизменяемы в java. Вы можете получить доступ к ответу экземпляра извне, но вы не можете вносить в него изменения. Если вы назначили новое значение ответу переменной внутри вашего класса/метода, там будет использоваться новый объект, к которому вы не можете получить доступ извне. (поскольку вы держите ссылку на старый экземпляр снаружи) вы можете сделать что-то подобное с изменяемым объектом. – DThought

+0

@DThought, Извините, я не принимал это во внимание. Я изменил ответ. – IntFloat

1

Я не думаю, что вы можете сделать это без EventHandler.Вы можете сделать что-то вроде этого, если вы действительно хотите использовать свой собственный класс:

AlertBox alert = new AlertBox("title","message"); 
alert.setYesAction(e -> { 
    //TO-DO 
}); 
alert.setNoAction(e -> { 
    //TO-DO 
}); 
alert.showAndWait(); 

И если вы хотите, чтобы проверить cancel статус независимо от кнопки, если пользователь нажал или вы не можете позвонить: alert.isCanceled();

import javafx.event.ActionEvent; 
import javafx.event.Event; 
import javafx.event.EventHandler; 
import javafx.geometry.Pos; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 
import javafx.scene.layout.HBox; 
import javafx.scene.layout.VBox; 
import javafx.stage.*; 

/** 
* An Alert Box for the GUI to display errors to the user. 
* 
*/ 
public class AlertBox extends Stage { 
    private boolean cancel = false; 
    private EventHandler<ActionEvent> yesAction = null; 
    private EventHandler<ActionEvent> noAction = null; 

    public AlertBox(String title, String message) { 
     super(); 
     initModality(Modality.APPLICATION_MODAL); // If window is up, 
     // make user handle 
     // it. 
     setTitle(title); 
     setMinHeight(350); 
     setMinWidth(250); 

     VBox root = new VBox(); // Root layout. 

     Label warning = new Label(message); // Message explaining what is wrong. 

     HBox buttonLayout = new HBox(); // The yes and cancel button. 

     Button yesButton = new Button("Yes"); // Yes button for the user. 
     Button noButton = new Button("No"); // No button for the user. 

     yesButton.setOnAction(e -> { 
      cancel = false; 
      yesAction.handle(new ActionEvent()); 
     }); 

     noButton.setOnAction(e -> { 
      cancel = true; 
      noAction.handle(new ActionEvent()); 
     }); 
     buttonLayout.getChildren().addAll(yesButton, noButton); 

     root.getChildren().addAll(warning, buttonLayout); 
     root.setAlignment(Pos.CENTER); 

     Scene scene = new Scene(root); 
     setScene(scene); 
    } 

    public void setYesAction(EventHandler<ActionEvent> yesAction){ 
     this.yesAction = yesAction; 
    } 
    public void setNoAction(EventHandler<ActionEvent> noAction){ 
     this.noAction = noAction; 
    } 

    public boolean isCanceled(){ 
     return cancel; 
    } 
} 
0

или вы можете обращаться в главном классе:

package application; 

import javafx.application.Application; 
import javafx.beans.value.ChangeListener; 
import javafx.beans.value.ObservableValue; 
import javafx.stage.Stage; 
import javafx.scene.Scene; 
import javafx.scene.layout.BorderPane; 

public class Main extends Application { 
    @Override 
    public void start(final Stage primaryStage) { 
    try { 
     final BorderPane root = new BorderPane(); 
     final Scene scene = new Scene(root, 400, 400); 

     final AlertBox warning = new AlertBox("Warning!", 
       "You are about to delete your account. Are you sure you would like to do this?");  

      warning.addCancelListener(new ChangeListener<Boolean>() { 

      @Override 
      public void changed(final ObservableValue<? extends Boolean> observable, final Boolean oldValue, final Boolean newValue) { 
       if (newValue) { 
        System.out.println("Tschüss"); 
       } else { 
        System.out.println("Thanks for confidence"); 
       } 
      } 
     }); 

     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } catch (final Exception e) { 
     e.printStackTrace(); 
    } 
}  

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

package application; 

import javafx.beans.property.ObjectProperty; 
import javafx.beans.property.SimpleObjectProperty; 
import javafx.beans.value.ChangeListener; 
import javafx.geometry.Pos; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 
import javafx.scene.layout.HBox; 
import javafx.scene.layout.VBox; 
import javafx.stage.Modality; 
import javafx.stage.Stage; 

/** 
* An Alert Box for the GUI 
* to display errors to the user. 
*/ 
public class AlertBox { 
    Stage window; 
    ObjectProperty<Boolean> cancel = new SimpleObjectProperty<>(null); 

    public AlertBox(final String title, final String message) { 
     cancel.setValue(null); 
     display(title, message); 
    } 

    private void display(final String title, final String message) { 
     window = new Stage(); // Create the stage. 

     window.initModality(Modality.APPLICATION_MODAL); // If window is up, make user handle it. 
     window.setTitle(title); 
     window.setMinHeight(350); 
     window.setMinWidth(250); 
     window.setAlwaysOnTop(true); 

     final VBox root = new VBox(); // Root layout. 

     final Label warning = new Label(message); // Message explaining what is wrong. 

     final HBox buttonLayout = new HBox(); // The yes and cancel button. 

     final Button yesButton = new Button("Yes"); // Yes button for the user. 
     final Button noButton = new Button("No"); // No button for the user. 

     yesButton.setOnAction(e -> { 
      cancel.set(false); 
      close(); 
     }); 

     noButton.setOnAction(e -> { 
      cancel.set(true); 
      close(); 
     }); 

     buttonLayout.getChildren().addAll(yesButton, noButton); 

     root.getChildren().addAll(warning, buttonLayout); 
     root.setAlignment(Pos.CENTER); 

     final Scene scene = new Scene(root); 
     window.setScene(scene); 
     window.show(); 
    } 

    /** 
    * Closes the window 
    * 
    * @param variable 
    */ 
    private void close() { 
     window.close(); 
    } 

    public void addCancelListener(final ChangeListener<Boolean> listener) { 
     cancel.addListener(listener); 
    } 
} 
Смежные вопросы