Ich würde vorschlagen, das du dir einen globalen Eventlistener erstellst, der dann ermittelt, für wen das event nun eigentlich gilt.
-> Wenn ein InternalFrame (focus hat/aktiv ist) und nicht geschlossen ist, dann ist dieser gemeint
-> wenn kein InternalFrame gemeint ist, dann ist das Hauptfenster gemeint
ich habe dir da mal eine Demo gebaut (Hilfe ist auf STRG+H, kann in der var SHORTCUT_HELP geändert werden):
[code=Java]
package globalFocusDemo;
import java.awt.AWTEvent;
import java.awt.AWTKeyStroke;
import java.awt.Component;
import java.awt.Toolkit;
import java.awt.event.AWTEventListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.KeyStroke;
public class GlobalFocusDemo
{
JDesktopPane desktop;
public static final AWTKeyStroke SHORTCUT_HELP = KeyStroke.getAWTKeyStroke(KeyEvent.VK_H, InputEvent.CTRL_DOWN_MASK);
public GlobalFocusDemo()
{
// create main frame with desktop-pane
JFrame mainFrame = new JFrame();
mainFrame.setSize(800,600);
desktop = new JDesktopPane();
mainFrame.setContentPane(desktop);
// create some internal-frames
createFrame("first");
createFrame("second");
// register global event listener, which only process the KeyEvent SHORTCUT_HELP
Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener()
{
public void eventDispatched(AWTEvent e)
{
// only handle key events
if (!(e instanceof KeyEvent))
{
return;
}
// if the pressed key match our shortcut...
if (KeyStroke.getAWTKeyStrokeForEvent((KeyEvent)e) == SHORTCUT_HELP)
{
// check if one of the internal-frames has...
for (Component comp : desktop.getComponents())
{
// (only handle internal-frames)
if (!(comp instanceof JInternalFrame))
{
continue;
}
JInternalFrame win = (JInternalFrame)comp;
// ... focus/isActive and is not closed
if ((win.hasFocus() || win.isSelected()) && !win.isClosed())
{
// print title of that window
System.out.println("Internal window " + win.getTitle() + " has focus");
// TODO: add HELP action for child window (win)
return;
}
}
// okey, no child has focus, main window has been targeted
System.out.println("main window has focus");
// TODO: add HELP action for main window (mainframe/desktop)
}
}
}, AWTEvent.KEY_EVENT_MASK);
mainFrame.setVisible(true);
}
private void createFrame(String windowName)
{
JInternalFrame frame = new JInternalFrame();
frame.setTitle(windowName);
frame.setSize(300,300);
frame.setVisible(true);
frame.setClosable(true);
desktop.add(frame);
}
public static void main(String[] args)
{
new GlobalFocusDemo();
}
}
[/code]