Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Wie didum richtig anmerkte einen Listener registrieren...
Wenn du nicht alle Methoden im Interface MouseListener implementieren möchtest,kannst du MouseAdapter nehmen und musst nur die Methode überschreiben, die du benötigst.
Java:
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class Labelklick extends JPanel {
class MeinMouseAdapter extends MouseAdapter {
@Override
public void mouseClicked(MouseEvent e) {
JOptionPane.showMessageDialog(null, "Label wurde geklickt");
}
}
public Labelklick() {
JLabel l = new JLabel("Click mich");
MouseAdapter k = new MeinMouseAdapter();
l.addMouseListener(k);
add(l);
}
public static void main(String[] args) {
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new Labelklick());
frame.pack();
frame.setVisible(true);
}
}
Der MouseAdapter ist natürlich schöner
Aber meiner Meinung ist die Klasse MeinMouseAdapter nicht nötig, da meist jedes Label ein anderes Ereignis hat wenn es angeklickt wird. (Korrigiert mich wenn ich falsch liege)
Hab mal den Code von turtle bissl geändert.
Java:
public class ClickMich2 extends JPanel {
public ClickMich2() {
JLabel l = new JLabel("Click mich");
l.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
JOptionPane.showMessageDialog(null, "Label wurde geklickt");
}
});
add(l);
JLabel l1 = new JLabel("Click mich auch");
l1.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
JOptionPane.showMessageDialog(null, ""Das Andere Label wurde geklickt"");
}
});
add(l1);
}
public static void main(String[] args) {
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new ClickMich2());
frame.pack();
frame.setVisible(true);
}
}
Und so würde es mit der MeinMouseAdapter aussehen falls dir das lieber ist:
Java:
public class ClickMich2 extends JPanel {
class MeinMouseAdapter extends MouseAdapter {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getSource() instanceof JLabel) {
JLabel source = (JLabel) e.getSource();
if (source.getText().equals("Click mich")) {
JOptionPane.showMessageDialog(null, "Label wurde geklickt");
} else if (source.getText().equals("Click mich auch")) {
JOptionPane.showMessageDialog(null,
"Das andere Label wurde geklickt");
}
}
}
}
public ClickMich2() {
JLabel l = new JLabel("Click mich");
l.addMouseListener(new MeinMouseAdapter());
add(l);
JLabel l1 = new JLabel("Click mich auch");
l1.addMouseListener(new MeinMouseAdapter());
add(l1);
}
public static void main(String[] args) {
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new ClickMich2());
frame.pack();
frame.setVisible(true);
}
}
Einem JLabel kann ein Listener hinzugefügt werden, der darauf reagiert, wenn auf dem JLabel geklickt wird. Dieses ist immer das MouseEvent-Ereignis.
Da es aber zwei verschiedene JLabel-Objekte sind, musst du auch auf beiden einen Listener für das Ereignis registrieren.
Aber du musst nur ein Listener-Objekt haben, der unterscheiden kann, auf welchem Objekt geklickt wurde. Dazu wird im MouseEvent (im Source-Objekt) mitgeteilt, wer der Auslöser war.
Ich persönlich halte wenig davon einen Listener zu haben, der anhand der Source-Eigenschaft unterscheidet was wirklich zu tun ist Aber das muss jeder für sich entscheiden.
Java:
import java.awt.BorderLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class LblTest extends JPanel {
private JLabel lbl1;
private JLabel lbl2;
public LblTest() {
setLayout(new BorderLayout());
lbl1 = new JLabel("KLick mich");
lbl2 = new JLabel("KLick mich auch");
MouseAdapter listener = new LblListener();
add(lbl1, BorderLayout.NORTH);
lbl1.addMouseListener(listener);
add(lbl2, BorderLayout.SOUTH);
lbl2.addMouseListener(listener);
}
class LblListener extends MouseAdapter {
@Override
public void mouseClicked(MouseEvent e) {
JLabel source = (JLabel) e.getSource();
if (source == lbl1) {
JOptionPane.showMessageDialog(null,
"Es wurde auf Label1 geklickt");
}
if (source == lbl2) {
JOptionPane.showMessageDialog(null,
"Es wurde auf Label2 geklickt");
}
}
}
public static void main(String[] args) {
JFrame frame = new JFrame("ButtonTest");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new LblTest());
frame.pack();
frame.setVisible(true);
}
}
mega THX
eine ganz kleine Frage noch:
Ich habe jetzt noch ein Button hinzugefügt mit:
PHP:
// declation wie die Labels nur mit JButton...
add(firstButton, BorderLayout.EAST);
firstButton.addMouseListener(listener);
Alles wird mir angezeigt wie ich es möchte.
Um ein Ereignis mit dem Button auslösen zu lassen, nur...:
PHP:
JLabel source = (JLabel) e.getSource();
// JButton sourceb = (JButton) e.getSource(); // <-- wenn ich die Zeile freischalte, kommt kein ErgebnissLabels mehr :-(
if (source == lbl1) {
JOptionPane.showMessageDialog(null,
"Es wurde auf Label1 geklickt");
....
Aber leider sieht es auch so aus, wie ich es nicht mag
Ich bin nämlich auch Anhänger von clean-code und dort sollte eine Klasse/Methode immer nur eine Sache machen. Und da sind ja switch oder verschachtelte if/else-Anweisungen eindeutige Hinweise, das hier mehr gemacht wird als "nur" eine Sache.
Daher würde ich drei verschiedene Listener implementieren. Aber jeder so wie er mag
ok danke,
leider geht das irgendwie nicht :-(
er merkt dass source doppelt belegt ist. Dann habe ich sourceb genommen und bekam:
PHP:
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: javax.swing.JButton cannot be cast to javax.swing.JLabel
at paketmann.tomclass$LblListener.mouseClicked(tomclass.java:70)
at java.awt.AWTEventMulticaster.mouseClicked(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)