2015-09-07 2 views
0

Я просмотрел многие сайты и не получил результата. У меня есть JTextFields, которые принимают только один символ. Мне нужно, чтобы, когда я нажимаю BACKSPACE, этот символ очищается, и фокус возвращается к предыдущему JTextField и так далее. Я добавил KeyListener ко всем JTextFields и попробовал KeyTyped, KeyReleased и KeyPressed, но никто не работал. Код:Возврат к предыдущему управлению при нажатии BACKSPACE

jt.addKeyListener(new KeyAdapter() { 

    public void keyTyped(KeyEvent evt) { 

     char c = evt.getKeyChar(); 

     if(Character.isLetter(c) || Character.isISOControl(c)) 
     { 
      evt = evt; 
     } else 
      evt.consume(); 
    } 

    public void keyReleased(KeyEvent evt) { 

     if(evt.getKeyChar() == KeyEvent.VK_BACK_SPACE) 
     { 
      robot.keyPress(KeyEvent.VK_BACK_SPACE); 
      robot.keyRelease(KeyEvent.VK_BACK_SPACE); 
      robot.keyPress(KeyEvent.VK_SHIFT); 
      robot.keyPress(KeyEvent.VK_TAB); 
      robot.keyRelease(KeyEvent.VK_TAB); 
      robot.keyRelease(KeyEvent.VK_SHIFT); 
     } 
    } 
}); 

Спасибо за любую помощь.

ответ

1
  1. Не используйте KeyListener. Swing был разработан для использования с Key Bindings.

  2. Не используйте робот. API имеет метод, который позволяет передавать фокус.

Вот основной код ключа Binding:

textField.getInputMap().put(KeyStroke.getKeyStroke("BACK_SPACE"), "backspace"); 
textField.getActionMap().put("backspace", new AbstractAction() 
{ 
    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
     Component c = (Component)e.getSource(); 
      c.transferFocusBackward(); 
    } 
}); 

У меня есть несколько текстовых полей JTextField, которые только принимают один символ.

Вы также можете посмотреть Text Field Auto Tab. Это класс, который позволит автоматически перейти к следующему текстовому полю при вводе символа.

+0

Большое спасибо ** camickr **. Я попробую ваш пример. –

0

Я быстро сделал небольшое приложение, которое мы надеемся решить вашу проблему, вот весь код:

import java.awt.event.FocusEvent; 
import java.awt.event.FocusListener; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.util.ArrayList; 
import javax.swing.GroupLayout; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 

public class BackspaceTest extends JFrame implements KeyListener { 

    // In this example I've used 4 Text Fields, each of which takes 1 character 
    private JTextField text1, text2, text3, text4; 

    // I've stored the Text Fields in a ArrayList so we can easily shuffle trough them later 
    private ArrayList<JTextField> fieldList = new ArrayList<>(); 

    // Numerical value for tracking the currently focused TextField 
    private int focusIndex; 

    // This constructor is the first thing that gets called from main 
    public BackspaceTest() { 
     init(); 
    } 

    private void init() { 
     // Initialize the text fields with 1 character column size 
     text1 = new JTextField(1); 
     text2 = new JTextField(1); 
     text3 = new JTextField(1); 
     text4 = new JTextField(1); 

     // Key listeners for implementing 1 character limitations and Backspace functionality 
     text1.addKeyListener(this); 
     text2.addKeyListener(this); 
     text3.addKeyListener(this); 
     text4.addKeyListener(this); 

     // The focus listener keeps track of currently focused Text Fields 
     text1.addFocusListener(new TextFocusListener()); 
     text2.addFocusListener(new TextFocusListener()); 
     text3.addFocusListener(new TextFocusListener()); 
     text4.addFocusListener(new TextFocusListener()); 

     // The default focus is on the first field 
     text1.requestFocus(); 

     fieldList.add(text1); 
     fieldList.add(text2); 
     fieldList.add(text3); 
     fieldList.add(text4); 

     // Puts the items on the screen 
     createLayout(text1, text2, text3, text4); 

     setTitle("Backspace Test"); 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
    } 

    private void createLayout(JComponent... arg) { 
     JPanel panel = (JPanel) getContentPane(); 
     GroupLayout gl = new GroupLayout(panel); 
     panel.setLayout(gl); 


     gl.setAutoCreateContainerGaps(true); 
     gl.setAutoCreateGaps(true); 

     gl.setHorizontalGroup(gl.createSequentialGroup() 
      .addComponent(arg[0]) 
      .addComponent(arg[1]) 
      .addComponent(arg[2]) 
      .addComponent(arg[3]) 
     ); 

     gl.setVerticalGroup(gl.createParallelGroup() 
      .addComponent(arg[0]) 
      .addComponent(arg[1]) 
      .addComponent(arg[2]) 
      .addComponent(arg[3]) 
     ); 

     gl.linkSize(text1, text2, text3, text4); 

     pack(); 
    }  

    class TextFocusListener implements FocusListener { 

      @Override 
      public void focusGained(FocusEvent e) { 
       focusIndex = fieldList.indexOf(getFocusOwner()); 
       System.out.println(focusIndex); 
      } 

      @Override 
      public void focusLost(FocusEvent e) { } 

     } 

    @Override 
    public void keyTyped(KeyEvent e) { } 

    @Override 
    public void keyPressed(KeyEvent e) { 

     JTextField focusedText = fieldList.get(focusIndex); 

//  Check if BACKSPACE is pressed and if Text Field is empty and if it's not the first field 
     if (e.getKeyCode() == KeyEvent.VK_BACK_SPACE && 
       focusedText.getText().equals("") && 
       focusIndex > 0) { 
      fieldList.get(--focusIndex).requestFocus(); 
     } 
    } 

    @Override 
    public void keyReleased(KeyEvent e) { 
     // This limits the amount of characteres to 1. I'm not fully pleased with it but it works for this demonstration 
     if (text1.getText().length() >= 1) 
      text1.setText(text1.getText().substring(0, 1)); 
     if (text2.getText().length() >= 1) 
      text2.setText(text2.getText().substring(0, 1)); 
     if (text3.getText().length() >= 1) 
      text3.setText(text3.getText().substring(0, 1)); 
     if (text4.getText().length() >= 1) 
      text4.setText(text4.getText().substring(0, 1)); 
    } 

    // Here's where the program starts 
    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new BackspaceTest().setVisible(true); 
      } 
     }); 
    } 
}); 

Если у вас нет времени, чтобы запустить его, посмотрите на строку 96, я думаю, Focus Listener - хороший способ решить вашу проблему. Надеюсь, это поможет вам, удачи!

Смежные вопросы