【问题标题】:Invisible Password隐形密码
【发布时间】:2016-11-06 16:17:54
【问题描述】:

在我最近的一个项目中,我想实现一个隐藏页面。我希望能够通过输入密码而不在屏幕上显示任何内容来访问它。我试图将PasswordField 设置为visible(false)。然而这并没有奏效。此外,我希望在输入密码后无需按回车即可弹出隐藏页面。有没有办法让一个简单的 javafx 应用程序表现得像这样?

【问题讨论】:

  • JPasswordField 是一个 Swing 组件,而不是 JavaFX 组件。您使用的是哪个工具包?
  • @James_D 你是对的!我打错了...我的意思是通常的 PasswordField
  • 这是JavaFX吗?为什么你有摇摆标签?如果这不是一个摇摆问题,你能把它去掉吗?

标签: java javafx passwords


【解决方案1】:

您可以使用KeyListener。尽管您需要按一次屏幕才能注册按键。并确保将 keylistener 添加到 JFrame,我总是忘记这一点。这将寻找键,但需要显示一个窗口,不过这可以是空的。

如果您完全不想要一个窗口,您可以使用外部库jnativehook,它会在全局范围内查找按键。

【讨论】:

    【解决方案2】:

    您可以在场景中添加一个事件过滤器来跟踪输入的内容。

    这是一个简单的例子(键入“secret”,主窗口聚焦以显示弹出窗口;如果键入错误,请按 Enter 清除隐藏文本):

    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);
        }
    }
    

    【讨论】:

      【解决方案3】:

      我相信您可以将 JPasswordField 的前景设置为与背景颜色相同,但不要引用我的话。比如:

      JPasswordField.SetForeground(Color.RED);
      

      【讨论】:

      • 还是可以看到光标的,我试试keylistener的方法
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-31
      • 2021-05-20
      • 2011-09-28
      • 1970-01-01
      • 2011-01-16
      • 1970-01-01
      • 2013-12-20
      相关资源
      最近更新 更多