getMousePosition(): andere Werte als erwartet

Status
Nicht offen für weitere Antworten.

peez

Bekanntes Mitglied
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

Top Contributor
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.
 
Zuletzt bearbeitet:

peez

Bekanntes Mitglied
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):

Java:
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

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

Java:
/* (@)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

Bekanntes Mitglied
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.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Libraries für AWT für andere Grafik-Frameworks tauglich machen AWT, Swing, JavaFX & SWT 6
M Hough-Transformation für Kreise und andere Formen AWT, Swing, JavaFX & SWT 3
H Swing Frame an andere Klassen weitergeben AWT, Swing, JavaFX & SWT 4
xYurisha JLabel Text einer geöffneten Gui über eine andere Klasse ändern! AWT, Swing, JavaFX & SWT 3
L TextField Eingabe in andere GUI übernehmen AWT, Swing, JavaFX & SWT 1
L JavaFX button über andere Klasse ändern AWT, Swing, JavaFX & SWT 7
K über Button andere Java Klasse aufrufen AWT, Swing, JavaFX & SWT 15
K JTable komplett durch andere ersetzen AWT, Swing, JavaFX & SWT 4
F Gui weicht von Designpreview ab (kein fensterrahmen, andere größe) AWT, Swing, JavaFX & SWT 13
kaoZ Swing JMenuBar, Preferences, Properties... und viele andere lustige Dinge (Best Practice) AWT, Swing, JavaFX & SWT 15
C Swing Update von swing-TableModels per Thread. Eins geht, das andere nicht, warum? AWT, Swing, JavaFX & SWT 12
G JPanel aufrufen in andere Klasse AWT, Swing, JavaFX & SWT 2
Rudolf Swing Andere Styles für Swing? AWT, Swing, JavaFX & SWT 4
J Zwei GUIs - Nach button-Klick soll ein Wert an die andere GUI übergeben werden AWT, Swing, JavaFX & SWT 15
bluerob Problem beim Image zeichnen via andere Klasse AWT, Swing, JavaFX & SWT 7
W Funktion aus einer Java Datei in eine andere einbauen AWT, Swing, JavaFX & SWT 25
G Swing Value von einer JScrollBar auf eine andere übertragen AWT, Swing, JavaFX & SWT 2
J Java bild in andere Klasse importieren AWT, Swing, JavaFX & SWT 5
C Gedrückter Button in andere Klasse übergeben AWT, Swing, JavaFX & SWT 5
J Swing JTable - nach Sortieren andere Methode aufrufen AWT, Swing, JavaFX & SWT 2
M Swing JList Item in andere JList während Ausführung AWT, Swing, JavaFX & SWT 4
A Swing Externe Schriftart mitkompilieren für andere PCs? AWT, Swing, JavaFX & SWT 3
Z andere Programmfenster relativ zum eigenen maximieren AWT, Swing, JavaFX & SWT 4
N Button on click eine andere Klasse aufrufen... AWT, Swing, JavaFX & SWT 2
M Swing Eine andere Klasse über Button starten und in TextArea ausgeben AWT, Swing, JavaFX & SWT 13
L Swing Bilder über andere Bilder laden AWT, Swing, JavaFX & SWT 3
F LayoutManager GridLayout 0/0 auf andere Ecke setzen AWT, Swing, JavaFX & SWT 4
E Listener, werte in andere Klasse übernehmen AWT, Swing, JavaFX & SWT 11
P Swing Auswahl einer JComboBox für eine andere JComboBox übernehmen AWT, Swing, JavaFX & SWT 4
F JScrollPane überlagert andere Elemente AWT, Swing, JavaFX & SWT 5
R Eingegebenen Text in JOptionPane in andere Klasse weitergeben AWT, Swing, JavaFX & SWT 2
C JButton in andere Klasse auslagern AWT, Swing, JavaFX & SWT 3
M Menübar soll bestehen bleiben, wenn andere Masken geöffnet werden AWT, Swing, JavaFX & SWT 4
D LayoutManager Main layout auf andere Class Dateien verweisen? AWT, Swing, JavaFX & SWT 17
M Zoomen in ein JPanel... und eine andere kleine Frage AWT, Swing, JavaFX & SWT 3
W bei änderungen in JTextField andere gelich mitändern AWT, Swing, JavaFX & SWT 3
D Textausgabe in jTextArea über andere Klasse AWT, Swing, JavaFX & SWT 6
K Wenn Mauszeiger in der Nähe vom Kreis, soll Kreis an eine andere Stelle springen AWT, Swing, JavaFX & SWT 8
J Swing - ich sehe keine Linie, andere schon AWT, Swing, JavaFX & SWT 6
S Andere Elemente in JComboBox anzeigen AWT, Swing, JavaFX & SWT 2
B view in andere View einbinden AWT, Swing, JavaFX & SWT 5
R 2 Threads nacheinander. Einer terminiert, der andere nicht. AWT, Swing, JavaFX & SWT 9
G JComboBox soll beim Öffnen eine andere JComboBox öffnen AWT, Swing, JavaFX & SWT 3
M ein Panel mit konst Größe das andere Variabel AWT, Swing, JavaFX & SWT 2
S Table Row per Drag and Drop in andere Table schieben? AWT, Swing, JavaFX & SWT 14
S Frame "on-the-fly" auf andere Sprache umstellen AWT, Swing, JavaFX & SWT 18
G Inhalt von JPanel andere Auflösung AWT, Swing, JavaFX & SWT 4
O JTable + event wenn andere Zeile selektiert ist AWT, Swing, JavaFX & SWT 5
G JButton und andere J-Elemente: Markierung ausblenden AWT, Swing, JavaFX & SWT 6
G JOptionPane mit andere Farbe AWT, Swing, JavaFX & SWT 8
O JComboBox andere Darstellung des Inhaltes + größe der Auswah AWT, Swing, JavaFX & SWT 11
G JTextField von andere classe updaten AWT, Swing, JavaFX & SWT 11
S String an eine andere Klasse im anderem package übergeben AWT, Swing, JavaFX & SWT 3
M JTable Zelle ändern -> andere Zellen mit ändern AWT, Swing, JavaFX & SWT 5
R Frage zu Listfeld oder jTable, auch andere Fragen AWT, Swing, JavaFX & SWT 5
G variable übergeben in andere klasse AWT, Swing, JavaFX & SWT 4
M JLabel über andere Klasse beschreiben AWT, Swing, JavaFX & SWT 2
F Auf Thread warten ohne alles andere zu blockieren AWT, Swing, JavaFX & SWT 5
G mousedown oder andere eventhandler in bluej AWT, Swing, JavaFX & SWT 13
V JTable Spaltenköpfe haben andere Namen wie in der DB AWT, Swing, JavaFX & SWT 2
V Werte aus TextField in eine andere Klasse? AWT, Swing, JavaFX & SWT 2
R Focus durch "tabben" von JTable Zelle auf andere K AWT, Swing, JavaFX & SWT 8
T JLabel neuzeichnen nach überdecken durch andere Fenster AWT, Swing, JavaFX & SWT 5
B Problem mit Übergabe bei action in andere Klasse AWT, Swing, JavaFX & SWT 4
B Container aus einen andere Klasse hinbekommen ? AWT, Swing, JavaFX & SWT 5
G [JOptionPane.showMessageDialog] andere Anordnung mgl? AWT, Swing, JavaFX & SWT 2
C JFreeChart X-Achse Werte skalieren, begrenzen, zoomen AWT, Swing, JavaFX & SWT 5
D ObservableList Werte hinzufügen AWT, Swing, JavaFX & SWT 7
missy72 JavaFX TableView / TableColumn / ObservableList / zwei Werte in einer Zelle AWT, Swing, JavaFX & SWT 2
J Swing Werte des JTable werden nicht angezeigt AWT, Swing, JavaFX & SWT 9
P Adressbuch Werte speichern AWT, Swing, JavaFX & SWT 21
Blender3D Falsche Werte mit Java Toolkit Screensize AWT, Swing, JavaFX & SWT 4
B JavaFX JavaFX TableView PropertyValueFactory für Werte aus HashMap AWT, Swing, JavaFX & SWT 2
F RGB-Werte aus einem String einlesen AWT, Swing, JavaFX & SWT 26
emma_louisa JavaFX Werte beim Aufrufen des Fensters übernehmen (SceneBuilder) AWT, Swing, JavaFX & SWT 3
Arif Swing MouseMotionListener liefert falsche Werte ? AWT, Swing, JavaFX & SWT 7
G Werte aus dem GUI Auslesen AWT, Swing, JavaFX & SWT 8
N Swing JFormattedTextField keine Werte nach Formatzuweisung AWT, Swing, JavaFX & SWT 0
B JavaFX Werte aus eingefügtem Window lesen AWT, Swing, JavaFX & SWT 0
Augenblau JavaFX Wechselnde Werte in Label darstellen AWT, Swing, JavaFX & SWT 7
M Swing JFreechart zoom x-achse neue Werte AWT, Swing, JavaFX & SWT 4
P Swing JTable Werte auslesen bzw überschreiben AWT, Swing, JavaFX & SWT 5
L JTable Werte mulitiplizieren AWT, Swing, JavaFX & SWT 3
R AWT Werte aus NumberField vergleichen AWT, Swing, JavaFX & SWT 9
H org.eclipse.swt.widgets.Slider und negative Werte AWT, Swing, JavaFX & SWT 3
S ComboBox-Werte aus einem Array an Textfields übergeben AWT, Swing, JavaFX & SWT 3
N Input/Output Stream werte in Label anzeigen. AWT, Swing, JavaFX & SWT 6
F JavaFX Properties und NULL Werte AWT, Swing, JavaFX & SWT 2
A JFreeChart BarChart invertierte anzeige oder werte bereich von-bis AWT, Swing, JavaFX & SWT 4
A Swing Bestimmte Werte anzeigen JSlider() AWT, Swing, JavaFX & SWT 2
T label überschriebt seine werte-SWT AWT, Swing, JavaFX & SWT 3
E werte zurück in GUI schreiben AWT, Swing, JavaFX & SWT 4
S JTable - 2D ArrayList & Falsche Werte. AWT, Swing, JavaFX & SWT 3
E werte aus List auslesen AWT, Swing, JavaFX & SWT 2
C Swing Default Werte für JFormattedTextField und Eingaben zurücksetzen AWT, Swing, JavaFX & SWT 5
K JTable Werte auslesen AWT, Swing, JavaFX & SWT 2
K JComboBox: Beim Einfügen neuer Werte ItemStateChanged blocken. AWT, Swing, JavaFX & SWT 2
Z Swing Mittels GUI Werte aus Property-File ändern AWT, Swing, JavaFX & SWT 5
S Swing Werte einer Jcheckbox aus eine Klasse A in eine Klasse B aufrufen AWT, Swing, JavaFX & SWT 6
P 2D-Grafik PaintComponent() übernimmt keine Werte aus update() AWT, Swing, JavaFX & SWT 8

Ähnliche Java Themen

Neue Themen


Oben