2016-11-06 3 views
0

В одном из моих последних проектов я хочу реализовать скрытую страницу. Я хочу иметь доступ к нему, просто набрав пароль без каких-либо показов на экране. Я попытался установить PasswordField как visible(false). Однако это не сработало. Также я хотел бы, чтобы скрытая страница всплывала, не нажимая клавишу ввода после ввода пароля. Есть ли способ для простого приложения javafx вести себя так?Невидимый пароль

+0

'JPasswordField' является свинг компонент , а не компонент JavaFX. Какой инструментарий вы используете? –

+0

@James_D ты прав! Я ошибся ... Я имел в виду обычный парольField – jobr97

+0

Итак, это JavaFX? Почему у вас есть качели? Можете ли вы удалить это, если это не вопрос качания? –

ответ

1

Вы можете добавить фильтр событий в сцену, которая будет отслеживать, что было напечатано.

Вот простой пример (типа «секрет» в главном окне сфокусировано, чтобы показать всплывающее окно, нажмите клавишу ввода, если вы ошиблись при вводе, чтобы очистить скрытый текст):

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.Label; 
import javafx.scene.control.Tooltip; 
import javafx.scene.input.KeyEvent; 
import javafx.scene.layout.StackPane; 
import javafx.stage.Stage; 

public class OpenSecretWindow extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     Label label = new Label("Type the secret password\nto open the secret window"); 
     label.setTooltip(new Tooltip("The secret password is \"secret\"")); 
     StackPane root = new StackPane(label); 
     Scene scene = new Scene(root, 400, 400); 

     StringBuilder typedText = new StringBuilder(); 
     scene.addEventFilter(KeyEvent.KEY_TYPED, e -> { 
      switch(e.getCharacter()) { 
      case "\n": 
      case "\r": 
       typedText.delete(0, typedText.length()); 
       break ; 
      default: 
       typedText.append(e.getCharacter()); 
      } 
      if ("secret".equals(typedText.toString())) { 
       openSecretWindow(primaryStage); 
       typedText.delete(0, typedText.length()); 
      } 
     }); 

     // handle backspace and delete: 
     scene.addEventFilter(KeyEvent.KEY_RELEASED, e -> { 
      if (e.getCode() == KeyCode.BACK_SPACE || e.getCode() == KeyCode.DELETE) { 
       if (typedText.length() > 0) { 
        typedText.delete(typedText.length()-1, typedText.length()); 
       } 
      } 
     }); 

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

    private void openSecretWindow(Stage owner) { 
     Stage stage = new Stage(); 
     StackPane root = new StackPane(new Label("You have found\nthe secret window!")); 
     Scene scene = new Scene(root, 300, 180); 
     stage.setScene(scene); 
     stage.initOwner(owner); 
     stage.show(); 
    } 

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

Вы можете использовать KeyListener. Хотя вам нужно нажать экран один раз для нажатия клавиш для регистрации. И не забудьте добавить keylistener в JFrame, я всегда забываю об этом. Это будет искать ключи, но для этого требуется окно, которое может быть пустым.

Если вы не хотите окно на все, вы можете использовать внешнюю библиотеку jnativehook, она ищет нажатия клавиш по всему миру.

+0

Я попробую это. – jobr97

1

Я считаю, что вы можете установить передний план JPasswordField таким же, как цвет фона, но не цитируйте меня на этом. Кое-что вроде:

JPasswordField.SetForeground(Color.RED); 
+0

Вы все еще можете видеть курсор, поэтому я попробую метод с помощью keylistener – jobr97