MouseListener für JPanel fehlt mouseClicked-events
Habe ich ein JPanel, dass ich erstellt habe einen MouseListener und ich sehe einige Verhalten, das ich nicht erklären kann.
In der Regel, wenn ich auf die Maus innerhalb des JPanel, sehe ich die folgenden Ereignisse ausgelöst:
mousePressed
mouseReleased
mouseClicked
Einige Male, ich sehe nicht, das mouseClicked event Feuer, ich sehe nur:
mousePressed
mouseReleased
Glaube ich nicht, ich mache nichts außergewöhnliches, wenn ich auf diese Zeiten. Könnte jemand erklären, warum ich vielleicht nicht sehen werden, sind die mouseClicked-event?
Ich bin mir nicht sicher, ob es relevant ist, aber ich habe eine animation läuft in der Systemsteuerung mithilfe eines javax.swing.Timer.
Jede Hilfe ist willkommen.
EDIT: hinzufügen von test-code, der sich repliziert problem. Ich bin mir nicht sicher, aber ich Frage mich, ob meine Maus hat nichts damit zu tun. Ich habe eine dieser super-sensitive gaming-Mäuse (von meinem alten COD4 Tagen).
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Test {
public static void main(String[] args) {
final Test test = new Test();
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
test.createAndShowGUI();
}
});
}
protected void createAndShowGUI() {
JFrame frame = new JFrame();
frame.setPreferredSize(new Dimension(1024, 768));
frame.setTitle("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
panel.setBackground(Color.WHITE);
panel.addMouseListener(new MouseListener() {
@Override
public void mouseReleased(MouseEvent e) {
System.out.println(":MOUSE_RELEASED_EVENT:");
}
@Override
public void mousePressed(MouseEvent e) {
System.out.println("----------------------------------\n:MOUSE_PRESSED_EVENT:");
}
@Override
public void mouseExited(MouseEvent e) {
System.out.println(":MOUSE_EXITED_EVENT:");
}
@Override
public void mouseEntered(MouseEvent e) {
System.out.println(":MOUSE_ENTER_EVENT:");
}
@Override
public void mouseClicked(MouseEvent e) {
System.out.println(":MOUSE_CLICK_EVENT:");
}
});
frame.add(panel);
frame.pack();
frame.setVisible(true);
}
}
- Kannst du etwas code ?
- Gerade Hinzugefügt eine Klasse, die repliziert das problem. Ich dachte, es könnte sein, dass meine Maus war zu empfindlich, und ich war immer B. mousemoved-events zwischen den mousePressed und mouseReleased-events, aber ich habe einen listener für B. mousemoved, und ich konnte das problem reproduzieren, ohne zu sehen, ein mouseMove-Ereignis in der Mitte.
- Vielen Dank für diese Frage, zusammen mit all den Antworten. Ich hatte genau das gleiche problem!!! (Wahrscheinlich meine sensible Maus).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Pro http://download.oracle.com/javase/tutorial/uiswing/events/mouselistener.html:
"Sie werden sehen, ein Maus-freigegeben Ereignis. Wenn Sie nicht die Maus bewegen, Maus-Klick-Ereignis Folgen wird."
Ich hatte gerade dieses problem. Wenn Sie die Maus bewegen, ein clicked-event wird nicht passieren. Ich habe wirklich keine Ahnung, was gut mouseClicked ist angesichts dieser Erkenntnisse. Ich reparierte es mit mouseReleased und zu überprüfen, ob die Maus innerhalb des Objekts:
Ich denke, dass ich das problem gefunden hier. Ich war immer intermediate mouseDragged-events zwischen den mousePress und mouseRelease. B. mousemoved nicht scheinen, um das problem verursachen, aber mouseDragged haben.
Ich nicht sicher bin ob es die richtige Lösung jetzt, aber zumindest jetzt kann ich erklären, was passiert.
Cheers
-Bill
Ein paar Anregungen für diejenigen, die mit diesem problem.
Erste: es könnte sein, Ihre Maus ist immer alt. Ich war immer seltsam Verhalten und es stellte sich heraus, dass die Maus gelegentlich werfen die Koordinaten, die waren Weg und es wäre dann springen Sie zurück in Ihre ursprüngliche position. Dies wird durch ziehen mit der Maus Ereignisse. Versuchen Sie eine andere Maus...
Zweiten: ich hatte ein problem, wo ich brauchte ein jPanel(A), die ich zeichnete auf, als BorderLayout.CENTER layout in einem anderen jPanel(B), die sich in einem jScrollPane.
Wenn jPanel(B) wurde geändert, die Zeichnung panel(A) - Skala, um die richtige Größe, weil der layout-manager BorderLayout aber (A) würde ignorieren, die Klicks, die außerhalb seines ursprünglichen Dimensionen, wenn (A) wurde nun größer als die ursprüngliche Größe.
Wenn jPanel(B) vergrößert wurde, die layout-manager war die Einstellung nicht (A)'s die Dimensionen, um die neue Größe, wenn es skaliert (A) zu passen, in der MITTE von jPanel(B). Der Maus-Klick-Ereignis würde nur Feuer für Klicks innerhalb der ursprünglichen Abmessungen jPanel(A). Ich musste manuell die Größe des jPanel(A), um seine neue Dimensionen skaliert, um zu bekommen, Mausklicks für alle Bereiche des jPanel(A).
In den Fällen, wenn alles was ich will ist das angeklickte Ereignis, dann verwende ich eine einfache
ActionListener
statt derMouseListner
. DieactionPerformed
Veranstaltung, für die Tasten und gleichermaßen atleast, entlassen werden, nur wie wollen wir ein Klick-event sein, D. H. so lange, wie die Maus auf die gleiche Steuerung bei release-Zeit, da war es an der Zeit gedrückt, wird einactionPerformed
event ausgelöst wird.