Создание виртуальной цифровой клавиатуры в java

Я разрабатываю настольное приложение. В этом приложении я должен использовать виртуальную клавиатуру/цифровую клавиатуру для операций входа в систему и т. д.

Я создал такой jframe: введите здесь описание изображения

и код создания кнопок

numberButtons = new JButton[10];
    for(int i = 0; i < numberButtons.length; i++ ) {
        numberButtons[i] = new JButton(String.valueOf(i));
    numberButtons[i].setFont(new java.awt.Font("Open Sans", 0, 14));
    numberButtons[i].setPreferredSize(new java.awt.Dimension(100, 50));

    numberButtons[i].addActionListener(new ActionListener()
    {
        public void actionPerformed(java.awt.event.ActionEvent evt)
        {
            numberButtonActionPerformed(evt);
        }
    });
        numberPanel.add(numberButtons[i]);
    }

и метод действия:

private void numberButtonActionPerformed(ActionEvent evt) {

    String currentPassword = ((JButton) evt.getSource()).getText();

    passwordField.requestFocus();
    passwordField.setText(passwordField.getText() + currentPassword);
    if (Arrays.equals(pass, passwordField.getPassword())) {
        System.out.println("Correct");
    }
}

но отправляется метод gettext jpasswordfield. Не рекомендуется использовать. У меня есть еще идея написать метод actionperformed для каждой кнопки и использовать "KeyEvent.VK_" в действии каждой кнопки. Однако я не думаю, что это правильный способ сделать это. Чтобы вы посоветовали?


person Emre    schedule 13.02.2017    source источник
comment
Каждая кнопка должна добавлять символ в массив или список, то, что вы пытаетесь сделать, это не генерировать String пароля. Возможно, вам потребуется вставить содержимое непосредственно в JPasswordField Document.   -  person MadProgrammer    schedule 13.02.2017
comment
Поскольку я хочу добавить char в поле пароля при нажатии кнопки, мне нужно было использовать метод «passwordfield.settext», который мне нужен для использования строки. Каков другой способ вставки непосредственно в упомянутый вами документ JPasswordField?   -  person Emre    schedule 13.02.2017
comment
Нет, вам нужно использовать Document#insertString, вставляя каждый символ (как отдельную строку) в документ   -  person MadProgrammer    schedule 13.02.2017


Ответы (3)


Вы уже использовали passwordField.getPassword(). Это правильный способ сделать это. В документах говорится, что getText заменено на getPassword: https://docs.oracle.com/javase/7/docs/api/javax/swing/JPasswordField.html#getText()

Чтобы создать строку из возвращенного char[], используйте этот конструктор.

person Selim    schedule 13.02.2017
comment
Чтобы построить строку из возвращенного char[] - это просто противоречит цели не использовать getText в первую очередь - person MadProgrammer; 13.02.2017
comment
@Selim Вы имеете в виду, что я должен сделать что-то подобное: private void numberButtonActionPerformed(ActionEvent evt) { passwordField.requestFocus(); passwordField.setText(new String(passwordField.getPassword())+ ((JButton) evt.getSource()).getText()); if(Arrays.equals(pass,passwordField.getPassword())){ System.out.println("Correct"); } } - person Emre; 13.02.2017
comment
@ Эмре, да. Однако это сведет на нет цель безопасности, которую char[] должен предоставить вам, как указал @MadProgrammer. В этом случае вы также можете заменить Arrays.equals на pass.equals(new String(passwordField.getPassword())) - person Selim; 13.02.2017

Создайте класс кнопки, который инкапсулирует JButton, создание слушателя и любые другие полезные функции. Затем используйте этот класс вместо кода создания кнопок.

person Jonathan Portorreal    schedule 13.02.2017

но метод gettext jpasswordfield отправляется

Не используйте setText(...) для сброса всего текста.

Вместо этого просто добавьте введенный символ в конец текстового компонента. Один из способов сделать это — использовать метод replaceSelection(...) текстового компонента.

Ознакомьтесь с: Присоединение прослушивателя одного действия ко всем кнопкам для рабочего примера. Обратите внимание, что пример позволит вам ввести символ или нажать кнопку.

person camickr    schedule 13.02.2017