Swing Maus in Panel einsperren

Knon

Mitglied
Hallo erstmal,

ich bräuchte bitte dringend hilfe. Und zwar hab ich einen JFrame über die ganze Seite und in der mitte ein JPanel.
Nun möchte ich das ich wenn man z.B. Leertaste drückt das der Mauszeiger auf das Panel in der mitte fokusiert wird und man nicht mehr mit der Maus aus dem Panel heraus kommt.

Gibt es da iwelche möglichkeiten das so umzusetzen??

Danke schon mal im Voraus

mfg
Knon
 
da musst ein wenig mit dem Methoden experimentieren. Im Prinzip musst du die Position der Maus korrigieren, sollte sie einen gewissen Grenzwert über/unterschreiten oder zB. die Methode mouseExited durch auf Panel aufgerufen werden.
 
So mal auf die schnelle:
Beim Verlassen des Panels wird die Maus mittels eines Robots in die Mitte des jPanels gesetzt.

Java:
import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class DiesUndDas
{

    public static JFrame frame;
    public static JPanel jPanel;
    public static Robot r;

    public static void main( String[] args ) throws AWTException
    {
        r = new Robot();
        frame = new JFrame( "MouseCageTest" );
        frame.setBounds( 400, 400, 400, 400 );
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jPanel = new JPanel();
        jPanel.addMouseListener( new java.awt.event.MouseAdapter()
        {
            public void mouseExited( java.awt.event.MouseEvent evt )
            {
                jPanelMouseExited( evt );
            }
            //Wird aufgerufen, wenn die Maus das Panel verlässt
            private void jPanelMouseExited( MouseEvent evt )
            {
                //Maus wird vom Robot wieder in die Mitte des Panels gesetzt
                r.mouseMove( frame.getX()+(jPanel.getWidth()/2), frame.getY()+(jPanel.getHeight()/2) );
            }
        } );
        
        frame.add( jPanel);
        frame.setVisible( true );
    }
}
 
Wie gesagt, schnell zusammengeschustert mit NetBeans... habs natürlich korrigiert.

Hier noch die Funktionalität der Space-Taste. Wenn die nun gedrückt wird, wird die Maus in die Mitte des Panels gesetzt.

Java:
import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class DiesUndDas
{

    public static JFrame frame;
    public static JPanel jPanel;
    public static Robot r;

    public static void main( String[] args ) throws AWTException
    {
        r = new Robot();
        frame = new JFrame( "MouseCageTest" );
        frame.setBounds( 400, 400, 400, 400 );
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        jPanel = new JPanel();
        jPanel.addMouseListener( new java.awt.event.MouseAdapter()
        {
            //Wird aufgerufen, wenn die Maus das Panel verlässt
            public void mouseExited( java.awt.event.MouseEvent evt )
            {
                //Maus wird vom Robot wieder in die Mitte des Panels gesetzt
                r.mouseMove( frame.getX() + (jPanel.getWidth() / 2), 
                        frame.getY() + (jPanel.getHeight() / 2) );
            }
        } );
        frame.addKeyListener( new KeyListener()
        {
            @Override
            public void keyReleased( KeyEvent e )
            {
                //Wurde die Leertaste gedrückt?
                if ( e.getKeyCode() == KeyEvent.VK_SPACE )
                {
                    //Maus wird vom Robot wieder in die Mitte des Panels gesetzt
                    r.mouseMove( frame.getX() + (jPanel.getWidth() / 2), 
                            frame.getY() + (jPanel.getHeight() / 2) );
                }
            }
            
            @Override
            public void keyTyped( KeyEvent e )
            {
            }

            @Override
            public void keyPressed( KeyEvent e )
            {
            }
        } );
        frame.add( jPanel );
        frame.setVisible( true );
    }
}
 
k danke viel mals,

hätt jetzt noch ne frage. Kann man iwie einem grafiktablet sagen das es nur einen JFrame/JPanel darstellt und nicht wie normal denn ganzen Bildschirm?
vlt mit JPen?
 

Zurück
Oben