Auf Thema antworten

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]



Oben