Re: Setting the Focus on Java windows (JInternalFrames)
RedGrittyBrick wrote:
Neo wrote:
I'm trying to set the focus on a Java JInternalFrame but it doesn't
work. Is this a bug? I have tried every method that contains the words
"focus": requestFoucs, setFocusable, etc. I want the window to have
the focus. Can someone show me how to do this?
Usually you have to arrange that focus requests are scheduled later than
the completion of the processing of the current GUI event (e.g.
mouse-click on a button or menu item).
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
widget.requestFocus();
}
});
Note, IME this applies even if the current thread is the EDT.
I must remember not to post untested guesswork!
The OP needs setSelected(true).
----------------------------- 8< ------------------------------
/**
* How to switch "Focus" between JInternalFrames
* @author RedGrittyBrick
*/
package org.redgrittybrick.test;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.beans.PropertyVetoException;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.SwingUtilities;
public class InternalFrameFocus {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new InternalFrameFocus().createAndShowGUI();
}
});
}
void createAndShowGUI() {
final JInternalFrame frameA = new JInternalFrame("A");
frameA.setSize(100, 70);
frameA.setLocation(60, 20);
frameA.setVisible(true);
final JInternalFrame frameB = new JInternalFrame("B");
frameB.setSize(100, 70);
frameB.setLocation(20, 40);
frameB.setVisible(true);
JDesktopPane desktop = new JDesktopPane();
desktop.setPreferredSize(new Dimension(300, 200));
desktop.add(frameA);
desktop.add(frameB);
Action a = new AbstractAction("A") {
@Override
public void actionPerformed(ActionEvent arg0) {
try {
frameA.setSelected(true);
} catch (PropertyVetoException e) {
e.printStackTrace();
}
}
};
Action b = new AbstractAction("B") {
@Override
public void actionPerformed(ActionEvent arg0) {
try {
frameB.setSelected(true);
} catch (PropertyVetoException e) {
e.printStackTrace();
}
}
};
JMenuItem itemA = new JMenuItem(a);
JMenuItem itemB = new JMenuItem(b);
JMenu menu = new JMenu("Focus");
menu.add(itemA);
menu.add(itemB);
JMenuBar bar = new JMenuBar();
bar.add(menu);
JFrame f = new JFrame("InternalFrameFocus");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(desktop);
f.setJMenuBar(bar);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}
----------------------------- 8< ------------------------------
--
RGB