ZaSz
October 21, 2008, 11:02pm
1
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…
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);
ZaSz
October 22, 2008, 1:54am
2
username.requestFocusInWindow(); isn't working, any idea on how to give focus to a component?
ZaSz
October 23, 2008, 3:15pm
3
Is it because I am using JInternalFrame?
hevee
October 23, 2008, 3:48pm
4
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.
ZaSz
October 23, 2008, 4:01pm
5
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
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);
ZaSz
November 12, 2008, 8:54pm
6
Nobody ever successfully used Swing text fields in JME?
foobar
February 15, 2009, 8:26pm
7
Is this still an issue? I too cannot force focus into a different text box. I can't even capture tab key presses.
ZaSz
February 15, 2009, 9:37pm
8
Yep, but our project is over…
Ricket
March 17, 2009, 12:11am
9
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?