Swing unable to handle TAB key and repeated backspaces?

I tried with FengGUI and had to code the TAB focus myself. Then I found lots of uninteresting things in FengGUI and switched to Swing thinking it would fix everything.



Is there a way that when I press Backspace and hold it, it does not only remove one letter?



Is there a way to enable TAB focus changing without having to code it myself? (Swing is supposed to handle this no??)



I really ran out of ideas… :frowning:



Anyone?





Edit: Code:


        frame = new JInternalFrame();
        frame.setSize(200, 200);
        frame.setLocation(displayWidth / 2 - frame.getWidth() / 2, displayHeight / 2
                - frame.getHeight() / 2);
        frame.setResizable(false);
        frame.setTitle(LanguageManager.getInstance().getMessage("login.title"));
        frame.setLayout(new GridLayout(6, 1));
        frame.setFocusable(true);
        frame.setFocusTraversalKeysEnabled(true);

        JLabel userLabel = new JLabel(LanguageManager.getInstance().getMessage("login.label.username"));
        frame.getContentPane().add(userLabel);
       
        username = new JTextField();
        username.setFocusTraversalKeysEnabled(true);
        username.setFocusable(true);

        frame.getContentPane().add(username);
       
        JLabel passwordLabel = new JLabel(LanguageManager.getInstance().getMessage("login.label.password"));
        frame.getContentPane().add(passwordLabel);
       
        password = new JPasswordField();
        password.setFocusTraversalKeysEnabled(true);
        password.setFocusable(true);
        password.addKeyListener(new KeyListener(){
         @Override
         public void keyPressed(KeyEvent e) {
            if (e.getKeyCode() == KeyEvent.VK_ENTER) {
               login();
               e.consume();
            }
         }
         @Override
         public void keyReleased(KeyEvent e) {}
         @Override
         public void keyTyped(KeyEvent e) {}
        });
        frame.getContentPane().add(password);
       
       
        login = new JButton(LanguageManager.getInstance().getMessage("login.button.login"));
        login.addMouseListener(new MouseListener() {
         @Override
         public void mouseClicked(MouseEvent e) {
            login();
         }
         @Override
         public void mouseEntered(MouseEvent e) {}
         @Override
         public void mouseExited(MouseEvent e) {}
         @Override
         public void mousePressed(MouseEvent e) {}
         @Override
         public void mouseReleased(MouseEvent e) {}
        });
        frame.getContentPane().add(login);

        JButton quit = new JButton(LanguageManager.getInstance().getMessage("login.button.exit"));
        quit.addMouseListener(new MouseListener() {
         @Override
         public void mouseClicked(MouseEvent e) {
            GameEngine.getInstance().quit();
         }
         @Override
         public void mouseEntered(MouseEvent e) {}
         @Override
         public void mouseExited(MouseEvent e) {}
         @Override
         public void mousePressed(MouseEvent e) {}
         @Override
         public void mouseReleased(MouseEvent e) {}
        });
        frame.getContentPane().add(quit);
       
        frame.setBorder(null);
        frame.setVisible(true);
        desktop.getJDesktop().add(frame);

username.requestFocusInWindow(); isn't working, any idea on how to give focus to a component?

Is it because I am using JInternalFrame?

You might have to wrap username.requestFocusInWindow() into a Runnable and call that using SwingUtilities.invokeLater() to inject the call into the swing  event dispatch thread.

Thanks for reply.

I already tried this.



Something weird is that when I add a focus listener on the InternalFrame or on its ContentPane, it is never called.

I use frame.setSelected(true); to give focus to the frame.



I also tried catching tab keys in username and set the focus on password but it doesn't work either :frowning:



        frame = new JInternalFrame();
        frame.setSize(200, 200);
        frame.setLocation(displayWidth / 2 - frame.getWidth() / 2, displayHeight / 2
                - frame.getHeight() / 2);
        frame.setResizable(false);
        frame.setTitle(LanguageManager.getInstance().getMessage("login.title"));
        frame.setLayout(new GridLayout(6, 1));
        frame.setFocusable(true);
        frame.setFocusTraversalKeysEnabled(true);

        JLabel userLabel = new JLabel(LanguageManager.getInstance().getMessage("login.label.username"));
        frame.getContentPane().add(userLabel);
       
        username = new JTextField();
        username.setFocusTraversalKeysEnabled(true);
        username.setFocusable(true);
        username.addKeyListener(new KeyListener(){
         @Override
         public void keyPressed(KeyEvent e) {
            if (e.getKeyCode() == KeyEvent.VK_TAB) {
               SwingUtilities.invokeLater(new Runnable(){
                  @Override
                  public void run() {
                     password.requestFocusInWindow();
                     password.requestFocus();
                  }});
               password.requestFocusInWindow();
               password.requestFocus();
            }
         }
         @Override
         public void keyReleased(KeyEvent e) {}
         @Override
         public void keyTyped(KeyEvent e) {}
      });
        frame.getContentPane().add(username);
       
        JLabel passwordLabel = new JLabel(LanguageManager.getInstance().getMessage("login.label.password"));
        frame.getContentPane().add(passwordLabel);
       
        password = new JPasswordField();
        password.setFocusTraversalKeysEnabled(true);
        password.setFocusable(true);
        password.addKeyListener(new KeyListener(){
         @Override
         public void keyPressed(KeyEvent e) {
            if (e.getKeyCode() == KeyEvent.VK_ENTER) {
               login();
               e.consume();
            }
         }
         @Override
         public void keyReleased(KeyEvent e) {}
         @Override
         public void keyTyped(KeyEvent e) {}
        });
        frame.getContentPane().add(password);
       
       
        login = new JButton(LanguageManager.getInstance().getMessage("login.button.login"));
        login.addMouseListener(new MouseListener() {
         @Override
         public void mouseClicked(MouseEvent e) {
            login();
         }
         @Override
         public void mouseEntered(MouseEvent e) {}
         @Override
         public void mouseExited(MouseEvent e) {}
         @Override
         public void mousePressed(MouseEvent e) {}
         @Override
         public void mouseReleased(MouseEvent e) {}
        });
        frame.getContentPane().add(login);

        JButton quit = new JButton(LanguageManager.getInstance().getMessage("login.button.exit"));
        quit.addMouseListener(new MouseListener() {
         @Override
         public void mouseClicked(MouseEvent e) {
            GameEngine.getInstance().quit();
         }
         @Override
         public void mouseEntered(MouseEvent e) {}
         @Override
         public void mouseExited(MouseEvent e) {}
         @Override
         public void mousePressed(MouseEvent e) {}
         @Override
         public void mouseReleased(MouseEvent e) {}
        });
        frame.getContentPane().add(quit);
       
        frame.setBorder(null);
        frame.setVisible(true);
        desktop.getJDesktop().add(frame);

Nobody ever successfully used Swing text fields in JME?

Is this still an issue? I too cannot force focus into a different text box. I can't even capture tab key presses.

Yep, but our project is over… :frowning:

I am also running into this problem. Has anyone else had experience with this and can offer a solution? I can't even figure out how to capture the tab event; as far as I can tell no keyTyped event is being generated. The multiple backspace issue is acceptable, but I must get the tab key to work and I really don't want to resort to a custom GUI just yet.



Thanks!

-Ricket



EDIT:

Okay, I found out that I can actually capture the tab event, and I am now (I was trying to do it in the KeyTyped event, which returns null for getKeyCode(), so I moved it to KeyReleased). Now I'm having the problem that requestFocus() is not working for my JTextFields. I had previously written a test case class which simply opens a JFrame, adds a JDesktopPane to it, and then adds my custom JInternalFrame class to it, and the frame works great with tab events and focusing and everything. However it doesn't work in the JMEDesktop implementation. requestFocus() appears to do nothing, despite it correctly being called (as a system.out.println shows).

Is this a bug then?