2015-02-06 3 views
1

В моем приложении первое, что я делаю, - это просить пользователя войти в систему, используя controlFX LoginDialog. Если вход успешно завершен, я показываю приложение, но если он не удался, окно входа в систему закроется.Как повторно открыть/предотвратить закрытие ControlsFX LoginDialog при неудачном входе в систему?

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

public void start(Stage stage) throws Exception { 

    LoginDialog ld = new LoginDialog(new Pair<String, String>("", ""), new Callback<Pair<String,String>, Void>() { 
     @Override 
     public Void call(Pair<String, String> info) { 
      boolean success = login(info.getKey(), info.getValue()); 
      if(success){ 
       openDriverWindow(stage); 
      }else { 
       //Display error message  
      } 
      return null; 
     } 
    }); 
    ld.show(); 

}

Если Войти не удалось, диалог закрывается - который требует, чтобы пользователь повторно открыть приложение.

+0

я не смог сделать эту работу - так я создал настраиваемый этап обработки входа, а не использование диалога. Если у кого-то есть лучший способ, я бы очень признателен. –

ответ

3

Вы можете использовать Dialog от JDK8u40, который будет выпущен в марте 2015 года или использовать диалоги из ConrolsFX (openjfx-dialogs-1.0.2). Существует код для реализации Dialog, который не будет закрыт до тех пор, пока аутентификация не будет передана.

// Create the custom dialog. 
Dialog<Pair<String, String>> dialog = new Dialog<>(); 
dialog.setTitle("Login Dialog"); 
dialog.setHeaderText("Look, a Custom Login Dialog"); 
dialog.setGraphic(new ImageView(this.getClass().getResource("login.png").toString())); 

// Set the button types. 
ButtonType loginButtonType = new ButtonType("Login", ButtonData.OK_DONE); 
dialog.getDialogPane().getButtonTypes().addAll(loginButtonType, ButtonType.CANCEL); 

// Create the username and password labels and fields. 
GridPane grid = new GridPane(); 
grid.setHgap(10); 
grid.setVgap(10); 
grid.setPadding(new Insets(20, 150, 10, 10)); 

TextField username = new TextField(); 
username.setPromptText("Username"); 
PasswordField password = new PasswordField(); 
password.setPromptText("Password"); 

grid.add(new Label("Username:"), 0, 0); 
grid.add(username, 1, 0); 
grid.add(new Label("Password:"), 0, 1); 
grid.add(password, 1, 1); 

// Enable/Disable login button depending on whether a username was entered. 
Button loginButton = (Button)dialog.getDialogPane().lookupButton(loginButtonType); 
loginButton.setDisable(true); 
**// Prevent closing dialog if not authenticated** 
loginButton.addEventFilter(ActionEvent.ACTION, (event) -> { 
    if (!authenticated()) { 
    event.consume(); 
    } 
}); 
// Do some validation (using the Java 8 lambda syntax). 
username.textProperty().addListener((observable, oldValue, newValue) -> { 
    loginButton.setDisable(newValue.trim().isEmpty()); 
}); 

dialog.getDialogPane().setContent(grid); 

// Request focus on the username field by default. 
Platform.runLater(() -> username.requestFocus()); 

// Convert the result to a username-password-pair when the login button is clicked. 
dialog.setResultConverter(dialogButton -> { 
    if (dialogButton == loginButtonType) { 
     return new Pair<>(username.getText(), password.getText()); 
    } 
    return null; 
}); 

Optional<Pair<String, String>> result = dialog.showAndWait(); 

result.ifPresent(usernamePassword -> { 
    System.out.println("Username=" + usernamePassword.getKey() + ", Password=" + usernamePassword.getValue()); 
}); 

этот пример был дан из этого article, где вы можете найти много полезных примеров

+0

Спасибо! Я не думал добавлять фильтр событий. –

0

Попробуйте это:

public class Main extends Application{ 


private boolean login(String key, String value){ 
    Pair loginData = new Pair<String, String>("test", "test"); 

    if (loginData.getKey().equals(key) && loginData.getValue().equals(value)) { 
     return true; 
    } 
    else { 
     //Вывести Alert. 
     Platform.runLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        Alert alert = new Alert(Alert.AlertType.ERROR, "Вы ввели неправильное имя или пароль"); 
        alert.setTitle("Error"); 
        alert.showAndWait(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
     return false; 
    } 
} 

@Override 
public void start(Stage primaryStage) throws Exception { 
    primaryStage.setTitle("Terminal Kuban-electro"); 

    getLogin(primaryStage); 
     primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() { 
      @Override 
      public void handle(WindowEvent t) { 
       System.exit(0); 
      } 
     }); 




} 


private void getLogin(Stage primaryStage){ 
    LoginDialog ld = new LoginDialog(new Pair<String, String>("", ""), new Callback<Pair<String, String>, Void>() { 
     @Override 
     public Void call(Pair<String, String> info) { 
      boolean success = login(info.getKey(), info.getValue()); 
      if (success) { 
       Scene scene = null; 
       try { 
        scene = new Scene(FXMLLoader.load(getClass().getClassLoader().getResource("fxml/main.fxml"))); 
        primaryStage.setScene(scene); 
        primaryStage.show(); 
       } catch (IOException e) { 

       } 
      } else { 
       getLogin(primaryStage); 
      } 
      return null; 
     } 
    }); 
    ld.setHeaderText("Введите имя пользователя и пароль"); 
    ld.setTitle("Авторизация"); 
    ld.show(); 

} 


public static void main(String[] args) throws MalformedURLException { 
    //Инициализация формы в потоке 
    Thread myThready = new Thread(() -> { 
     launch(args); 
    }); 
    myThready.start(); 


} 

}

 Смежные вопросы

  • Нет связанных вопросов^_^