隐形密码

时间:2016-11-06 16:17:54

标签: java javafx passwords

在我最近的一个项目中,我想实现一个隐藏的页面。我希望只需输入密码即可在屏幕上显示任何内容。我试图将PasswordField设为visible(false)。但是那没用。此外,我希望弹出隐藏的页面,而无需在输入密码后按Enter键。有一种方法可以让简单的javafx应用程序像这样表现吗?

3 个答案:

答案 0 :(得分:2)

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

如果您不想在>所有的窗口,则可以使用外部库jnativehook全局查找按键。

答案 1 :(得分:1)

我相信你可以将JPasswordField的前景设置为与背景颜色相同,但不要引用我的话。类似的东西:

my_string = "abba"
for idx in range(len(my_string) - 1, 0, -1):
    char = my_string[idx]
    if char in my_string[:idx]:
        print("Last duplicated character is: " + char)
        break

答案 2 :(得分:1)

您可以向场景添加事件过滤器,以跟踪已键入的内容。

这是一个简单的例子(类型"秘密"主窗口聚焦显示弹出窗口;如果输入错误以清除隐藏文本,请按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);
    }
}