2017-02-13 15 views
0

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

Я создал JFrame, как это: enter image description here

и код создания кнопок является

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_» в действии каждой кнопки. Однако я не думаю, что это правильный способ сделать это. Чтобы вы посоветовали?

+0

Каждая кнопка должна добавить символ в массив или список, что вы пытаетесь сделать, не генерирует 'String' пароля. Возможно, вам нужно будет вставить содержимое непосредственно в '' Документ 'JPasswordField' – MadProgrammer

+0

Так как я хочу добавить символ в поле пароля при нажатии кнопки, мне нужно было использовать метод passwordfield.settext, который мне нужен для использования строки. Каков другой способ вставить прямо в документ JPasswordField, о котором вы упомянули? – Emre

+0

Нет, вам нужно использовать Document # insertString, вставляя каждый символ (как отдельную строку) в документ – MadProgrammer

ответ

0

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

Для построения строки из возвращенного char[] использование this конструктора.

+0

* «Чтобы построить String из возвращаемого char []" * -, который просто побеждает цель не использовать 'getText' в первую очередь – MadProgrammer

+0

@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 («Исправить»); } } ' – Emre

+0

@Emre да. Однако это победит цель «безопасности», которую 'char []' должен дать вам, как указал @MadProgrammer.В этом случае вы также можете заменить 'Arrays.equals'' pass.equals (new String (passwordField.getPassword())) ' – Selim

0

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

0

но метод Gettext JPasswordField в послана

Не используйте SetText (...), чтобы сбросить весь текст.

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

Отъезд: Attaching A Single Action Listener To All Buttons для рабочего примера. Обратите внимание, что пример позволит вам ввести символ или нажать кнопку.