# getMousePosition(): andere Werte als erwartet



## peez (4. Okt 2009)

Ich baue mir gerade eine eigene Swing Komponente.
Beim Testen in einem ansonsten leeren JFrame ohne Menu hat auch alles super funktioniert.
Jetzt wo die Komponente in ein Proramm mit Menuleiste eingebaut ist, scheint sowohl getMousePosition() als auch die Maus-Position in den Mouse Events nicht mehr so zu stimmen, wie ich angenommen hatte.

Habe ich den Mauszeiger genau auf der Grenze zwischen Menüleiste und meinem JComponent, dann gibt mir getMousePosition() einen y-Wert von ca. 50 statt der erwarteten 0...

Wird da etwa die Menuleiste mit dazugerechnet bzw. wie könnte man das ausgleichen?


----------



## hdi (4. Okt 2009)

Zu welcher Komponente gehört denn der MouseListener? Wahrscheinlich ja nicht zum Frame, oder?

edit: Äh ich meine, der hängt wohl _schon_ am Frame  Die Menüleiste ist ja auch nichts anderes als etwas, das man in das Frame gelegt hat. Von daher zählt die natürlich zur Frame-Fläche dazu. Was du willst, ist wohl den Listener an dein JPanel hängen, oder was auch immer das für eine Komponente ist, die unter der Menüleiste liegt.


----------



## peez (4. Okt 2009)

Der Mouselistener ist schon an das neue JComponent gehängt. Auch getMousePosition() rufe ich natürlich für den JComponent auf.
Komisch - habe gerade die Struktur wie ich sie in meinem Programm habe, vereinfacht nachgebaut (JFrame -> JPanel -> Mein Component) und da funktioniert alles wie erwartet..
Wäre irgendeine Konstellation vorstellbar, wo die Menuleiste irgendwie über die Komponenten drüberliegt?

Zur Vollständigkeit mein vereinfachter Versuch (der funktioniert):


```
public class Test extends JFrame {

	private JPanel componentPanel;

	private DPGrid myComponent;
	
	private JMenuBar menuBar;

	public Test() {
		setLayout( new BorderLayout() );

		componentPanel = new JPanel();
		add( componentPanel, BorderLayout.CENTER );

		componentPanel.setLayout( new BorderLayout() );

		myComponent = new DPGrid(5,3);
		componentPanel.add( myComponent, BorderLayout.CENTER );

		// Zum Testen gebe ich jede Sekunde die Maus-Position aus:
		new Thread( new Runnable() {

			public void run() {
				while (true) {
					try {
						System.out.println( myComponent.getMousePosition().toString() );
					} catch (Exception e) {
						System.err.println( "exc" );
					}

					try {
						Thread.sleep( 1000 );
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		} ).start();
		
		createMenu();

		setVisible( true );

	}
	
	private void createMenu() {
		menuBar = new JMenuBar();
		JMenu menu_File = new JMenu("EinMenu");
		
		menuBar.add(menu_File);
		setJMenuBar( menuBar );
	}

	public static void main( String args[] ) {
		new Test().setVisible( true );
	}
}
```


----------



## Ebenius (5. Okt 2009)

Das verstehe ich nicht ganz. Bei mir funktioniert alles. Ein Beispiel:


```
/* (@)MouseTestGUI.java */

/* Copyright 2009 Sebastian Haufe

 * Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       [url]http://www.apache.org/licenses/LICENSE-2.0[/url]

 * Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License. */

package com.ebenius;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.*;

/**
 * Mouse Position test GUI.
 * 
 * @version $Revision$ as of $Date$
 * @author Sebastian Haufe
 */
public class MouseTestGUI {

  /**
   * Test main method.
   * 
   * @param args ignored
   */
  public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {

      @Override
      public void run() {
        createAndShowGUI();
      }
    });
  }

  private static void createAndShowGUI() {
    final JLabel mouseInfo = new JLabel();
    mouseInfo.setPreferredSize(new Dimension(400, 30));
    final MouseAdapter mouseAndMotion = new MouseAdapter() {

      private void updateMouseInfo(MouseEvent e) {
        final Point p1 = e.getPoint();
        final Point p2 = e.getComponent().getMousePosition();
        mouseInfo.setText(p1.x + "=" + p2.x + " x " + p1.y + "=" + p2.y);
      }

      @Override
      public void mouseEntered(MouseEvent e) {
        updateMouseInfo(e);
      }

      @Override
      public void mouseReleased(MouseEvent e) {
        updateMouseInfo(e);
      }

      @Override
      public void mouseMoved(MouseEvent e) {
        updateMouseInfo(e);
      }
    };

    final JPanel mousePanel = new JPanel(new BorderLayout());
    mousePanel.addMouseListener(mouseAndMotion);
    mousePanel.addMouseMotionListener(mouseAndMotion);
    mousePanel.add(mouseInfo);

    final JMenuBar menubar = new JMenuBar();
    menubar.add(new JMenu("Dummy"));

    final JPanel contentPane = new JPanel(new BorderLayout(6, 6));
    contentPane.add(mousePanel);

    final JFrame f = new JFrame("Test Frame: MouseTestGUI");
    f.setJMenuBar(menubar);
    f.setContentPane(contentPane);
    f.pack();
    f.setLocationRelativeTo(null);
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    f.setVisible(true);
  }
}
```
Ebenius


----------



## peez (5. Okt 2009)

Habe das Problem gefunden (obwohl ich es noch nicht so ganz verstehe).
Ich hatte getParent() in einer der Ebenen überschrieben.
Obwohl es nach meinem Verständnis das gleiche hätte zurückgeben müssen (einfach ne Ableitung von JFrame), ist dadurch dieser Effekt passiert.
Ohne getParent() funktioniert alles super.


----------

