JLabel zum klicken...

Habe den Code nicht durchgesehen, aber um ein Label anklicken zu können einfach einen MouseListener hinzufügen.

Java:
JLabel l = new JLabel();
l.addMouseListener(new MouseListener() {
			
		@Override
		public void mouseReleased(MouseEvent arg0) {
			// TODO Auto-generated method stub
				
		}
			
		@Override
		public void mousePressed(MouseEvent arg0) {
			// TODO Auto-generated method stub
				
		}
			
		@Override
		public void mouseExited(MouseEvent arg0) {
			// TODO Auto-generated method stub
			
		}
			
		@Override
		public void mouseEntered(MouseEvent arg0) {
			// TODO Auto-generated method stub
			
		}
		
		@Override
		public void mouseClicked(MouseEvent arg0) {
			// TODO Auto-generated method stub
			
		}
	});
 
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);
	}

}
 
1000 dank !!!!
ich habt wirklich Ahnung von java

ganz kurze Frage, ich habe 2 Label, und möchte 2 Ergebnisse.
PHP:
JLabel ee = new JLabel("drück mich");
            MouseAdapter b = new MeinMouseAdapter();
            ee.addMouseListener(b);
            add(ee);

soweit so gut,

PHP:
class MeinMouseAdapter extends MouseAdapter {
            @Override
            public void mouseClicked(MouseEvent e) {
          [B]  // if lbalblablaba ??????[/B]    
            JOptionPane.showMessageDialog(null, "Label wurde geklickt");
            }
if (e == ??) Ich stehe voll auf dem Schlauch. ;(
 
Zuletzt bearbeitet:
Ich habe jetzt nicht in der API nachgelesen, aber ich glaube die Methode getSource() gibt es und sie sollte dann dein JLabel zurückgeben.

Wenn du aber den Listener nur für das JLabel verwendest, kannst du dir das if genauso gut schenken.
 
Zuletzt bearbeitet:
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);
	}
}
 
meist jedes Label ein anderes Ereignis hat wenn es angeklickt wird
Eben nicht.

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");
....
 
Zuletzt bearbeitet:
Java:
class LblListener extends MouseAdapter {
	@Override
	public void mouseClicked(MouseEvent e) {
		if (e.getSource() instanceof JLabel) {
			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");
			}
		}
		
		if (e.getSource() instanceof JButton) {
			JButton source = (JButton) e.getSource();
			if (source == firstButton) {
				JOptionPane.showMessageDialog(null,
						"Es wurde auf Button geklickt");
			}
		}
	}
}
 
Sieht gut aus:toll:

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)
 
ich dachte ich sollte vielleicht doch dein Quellcode posten 🙂
Wieso JLabel der Mouselistener ist doch allegemein oder?
PHP:
 package paketmann;
 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; 
 import javax.swing.JButton;  
 import javax.swing.ImageIcon;

 public class tomclass extends JPanel {
     private JLabel lbl1;
     private JLabel lbl2;
     private JButton firstButton; 
     public tomclass() 
     
    {
         setLayout(new BorderLayout());
 		        	
	     firstButton = new JButton(new ImageIcon("c:/1.jpg"));	        
         lbl1 = new JLabel("KLick mich");
         lbl2 = new JLabel("KLick mich auch");
         
         MouseAdapter listener = new LblListener();
         
         add(firstButton, BorderLayout.EAST);         
         firstButton.addMouseListener(listener);         
         
         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");
             }
             
             if (e.getSource() instanceof JButton) {
                 JButton sourceb = (JButton) e.getSource();
                 if (sourceb == firstButton) {
                     JOptionPane.showMessageDialog(null,
                             "Es wurde auf Button geklickt");
                 }
             }
                       
         }
     }
    
     public static void main(String[] args) {
         JFrame frame = new JFrame("ButtonTest");
         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         frame.add(new tomclass());
         frame.pack();
         frame.setVisible(true);
     }
 }
 
lbl1 = new JLabel(new ImageIcon("c:/1.jpg"));

Geht aber nur unter Windows🙁

Hinweis: Klassennamen sollten per Konvention mit einem Grossbuchstaben beginnen.
Java:
import java.awt.BorderLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class Tomclass extends JPanel {
	private JButton firstButton;
	private JLabel lbl1;
	private JLabel lbl2;

	class LblListener extends MouseAdapter {
		@Override
		public void mouseClicked(MouseEvent e) {
			Object source = e.getSource();

			if (source == lbl1) {
				JOptionPane.showMessageDialog(null,
						"Es wurde auf Label1 geklickt");
			}
			if (source == lbl2) {
				JOptionPane.showMessageDialog(null,
						"Es wurde auf Label2 geklickt");
			}

			if (source == firstButton) {
				JOptionPane.showMessageDialog(null,
						"Es wurde auf Button geklickt");
			}
		}
	}

	public Tomclass() {
		firstButton = new JButton(new ImageIcon("c:/1.jpg"));
		lbl1 = new JLabel("KLick mich");
		lbl2 = new JLabel("KLick mich auch");

		MouseAdapter listener = new LblListener();

		add(firstButton, BorderLayout.EAST);
		firstButton.addMouseListener(listener);

		add(lbl1, BorderLayout.NORTH);
		lbl1.addMouseListener(listener);

		add(lbl2, BorderLayout.SOUTH);
		lbl2.addMouseListener(listener);
	}

	public static void main(String[] args) {
		JFrame frame = new JFrame("ButtonTest");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.add(new Tomclass());
		frame.pack();
		frame.setVisible(true);
	}
}
 
Zuletzt bearbeitet:

Zurück
Oben