# Frage zu processMouseEvent



## Gast2 (25. Jun 2010)

Hallo zusammen,

warum muss ich wenn ich bei einem Panel die processMouseEvent überschreib erst einen Listener adden, damit die Methode überhaupt anspringt siehe Konstrutkor desTestpanels, ohne dieses add wird nie die Ausgabe kommen.


```
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Line2D;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class TestFrame extends JFrame {

	public TestFrame() {
		super("test");
		add(new Testpanel(), BorderLayout.CENTER);
		setSize(400, 400);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

	public static class Testpanel extends JPanel {

		public Testpanel() {
			addMouseListener(new MouseAdapter() {
			});

		}

		@Override
		protected void processMouseEvent(MouseEvent e) {
			super.processMouseEvent(e);

			if (e.getID() == MouseEvent.MOUSE_PRESSED) {
				System.out.println("hier");
			}

		}

	}

	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {

			@Override
			public void run() {
				TestFrame testFrame = new TestFrame();
				testFrame.setVisible(true);
			}
		});
	}

}
```


----------



## knoppers (25. Jun 2010)

```
addMouseListener(new MouseAdapter() {
            });
```

ist falsch


```
addMouseListener(this);
```

ist richtig

Du musst deiner Klasse sagen das sie den Listener über deine Klasse nehmen soll. Grund hierfür ist das ja der, oder die Listener nicht umbedingt etwas mit, oder von deiner Klassen zu tun haben könnten.


----------



## L-ectron-X (25. Jun 2010)

processMouseEvent() ist eine veraltete Methode aus Java 1.0. Du solltest nur noch die Methoden ab Java 1.1 mit Delegation-Model benutzen.

@knoppers: Das ist dann aber auch nur die halbe Wahrheit...


----------



## Gast2 (30. Jun 2010)

L-ectron-X hat gesagt.:


> processMouseEvent() ist eine veraltete Methode aus Java 1.0. Du solltest nur noch die Methoden ab Java 1.1 mit Delegation-Model benutzen.



das steht wo?

JComponent

```
/**
     * Processes mouse events occurring on this component by
     * dispatching them to any registered
     * <code>MouseListener</code> objects, refer to
     * {@link java.awt.Component#processMouseEvent(MouseEvent)}
     * for a complete description of this method.
     *
     * @param       e the mouse event
     * @see         java.awt.Component#processMouseEvent
     * @since       1.5
     */
    protected void processMouseEvent(MouseEvent e) {
        if (autoscrolls && e.getID() == MouseEvent.MOUSE_RELEASED) {
            Autoscroller.stop(this);
        }
        super.processMouseEvent(e);
    }
```

Component

```
/**
     * Processes mouse events occurring on this component by
     * dispatching them to any registered
     * <code>MouseListener</code> objects.
     * <p>
     * This method is not called unless mouse events are
     * enabled for this component. Mouse events are enabled
     * when one of the following occurs:
     * <p><ul>
     * <li>A <code>MouseListener</code> object is registered
     * via <code>addMouseListener</code>.
     * <li>Mouse events are enabled via <code>enableEvents</code>.
     * </ul>
     * <p>Note that if the event parameter is <code>null</code>
     * the behavior is unspecified and may result in an
     * exception.
     *
     * @param       e the mouse event
     * @see         java.awt.event.MouseEvent
     * @see         java.awt.event.MouseListener
     * @see         #addMouseListener
     * @see         #enableEvents
     * @since       JDK1.1
     */
    protected void processMouseEvent(MouseEvent e) {
        MouseListener listener = mouseListener;
        if (listener != null) {
            int id = e.getID();
            switch(id) {
              case MouseEvent.MOUSE_PRESSED:
                  listener.mousePressed(e);
                  break;
              case MouseEvent.MOUSE_RELEASED:
                  listener.mouseReleased(e);
                  break;
              case MouseEvent.MOUSE_CLICKED:
                  listener.mouseClicked(e);
                  break;
              case MouseEvent.MOUSE_EXITED:
                  listener.mouseExited(e);
                  break;
              case MouseEvent.MOUSE_ENTERED:
                  listener.mouseEntered(e);
                  break;
            }
        }
    }
```


----------



## L-ectron-X (30. Jun 2010)

SirWayne hat gesagt.:


> das steht wo?


Bin mir ziemlich sicher, das mal gelesen zu haben. Hoffe nicht, dass ich mich geirrt habe... :autsch:

Ich weiß zwar nicht, was du genau machen möchtest, aber benutze besser die Methoden aus MouseListener.


----------



## Gast2 (30. Jun 2010)

Bei nem JTextfield oder anderen Componenten geht es auch...
Ich finde des doof wenn man eine eigene Componente macht, indem eigenen Konstruktor einen Listener auf sich selber zu adden :autsch:...

Da ein Bsp. wos geht.
http://www.java-forum.org/java-basics-anfaenger-themen/102604-fokusevent-problem.html

Aber wahrscheinlich haben JButton und JTextfield usw. schon einen Listener darauf, deshalb geht es...


----------



## jakob190590 (27. Mai 2012)

Nur zur Ergänzung:


L-ectron-X hat gesagt.:


> processMouseEvent() ist eine veraltete Methode aus Java 1.0. Du solltest nur noch die Methoden ab Java 1.1 mit Delegation-Model benutzen.



Da hast du dich vertan. mouseDown, mouseDrag, mouseUp usw. (aus 1.0) sind veraltet, und processMouseEvent ist der Ersatz (seit 1.1):
Component (Java 2 Platform SE v1.4.2)

Und zur allerersten Frage: Is halt so, siehe link oberhalb 
Statt einen Listener zu adden, kannst du processMouseEvent auch manuell aktivieren mit enableEvents.


----------

