Edit: JLabel+MouseListener oeffnet mehrere Instanzen

Tschibo

Mitglied
Hallo Leute!(Edit unten lesen)
Habe ein Problem mit Runtime.getRuntime().exec. Ich will auf Knopf(oder Bild)-Druck verschiedene Dinge aufrufen lassen (wie z.B. Internetseite im Standardbrowser oeffnen). Das klappt meistens auch gut, manchmal passiert es aber, dass trotz einfachem Klickens mehrere Seiten geoeffnet werden.

Mein Code:

Java:
else if(e.getSource().equals(adminliste))
			{
				try {
					Runtime.getRuntime().exec
					("rundll32 url.dll,FileProtocolHandler " + "http://www.eineadresse.de");
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}


Das Bild worauf geklickt wird liegt in einem JLabel (BufferedImage-->ImageIcon-->JLabel). Das Klicken wird scheinbar auch eindeutig registriert. Wenn ich etwa anstatt des Seitenaufrufs System.out.println() oder sonstige "primitive" Befehle ausfuehren lasse funktioniert alles zuverlaessig.

Weiss da einer Rat?

Edit: Hach, es ist doch anders als es schien. Runtime scheint zuverlaessig zu funktionieren und es ist doch die Klickregistrierung via MouseListener. Vorherige tests habe ich naemlich mit JButtons gemacht, bei diesen war ein Klick immer auch ein Klick. Ein JLabel aber registriert einen klick als zwei oder drei Klicks?

Was mache ich:

Java:
BufferedImage bild = new BufferedImage(new File(path));
ImageIcon IconBild = new ImageIcon(bild);
JLabel labelBild = new JLabel(IconBild);

labelBild.addMouseListener(new MyMouseListener());

class MyMouseListener extends MouseAdapter{
public void mouseReleased(MouseEvent e)
{
int x = 0;

if(e.getSource().equals(labelBild))
			{
                               x++;
				System.out.println("ich reagiere " +x);
//das folgende soll eigentlich passieren:
//				try {
//					Runtime.getRuntime().exec
//					("rundll32 url.dll,FileProtocolHandler " + "http://www.google.de");
//				} catch (IOException e1) {
//					// TODO Auto-generated catch block
//					e1.printStackTrace();
//				}
				
			}

Mache ich hier etwas komplett falsch? Kann mir das nicht erklaeren.
 
Zuletzt bearbeitet:
M

MiDniGG

Gast
Also erst mal. Das hier gibt es nicht:

Java:
new BufferedImage(new File(path));
Der Konstruktor von BufferedImage erwartet kein File-Objekt...

Weiterhin. Warum immer diese inner-classes?

Implementiere das MouseListener-Interface und überschreibe die Methode mouseReleased(MouseEvent e).

Für mehr Infos bräuchte man mehr code... :)
 
S

SlaterB

Gast
> System.out.println("ich reagiere " +x);
kommt nun also mehrfach als Ausgabe?

auch in folgendem Testprogramm?
Java:
public class TestGUI  extends JFrame {
    public TestGUI() {
        final JLabel labelBild = new JLabel(new ImageIcon("test.jpg"));
        labelBild.addMouseListener(new MouseAdapter()  {
                public void mouseReleased(MouseEvent e)  {
                    System.out.println("ich reagiere " + hashCode() + ", " + 
                       labelBild.getListeners(MouseListener.class).length);
                }
            });

        add(labelBild);
        setSize(300, 300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

    public static void main(String[] args)  {
        new TestGUI();
    }
}
kopiere das System.out.println() auch in dein Programm um zu testen, ob du mehrere Listener an das JLabel gebunden hast,
test außerdem ob das ganze bei einem normalen JLabel mit Text genauso passiert,
aber ich sehe gerade dass du das Bild gar nicht erst im Titel erwähnt hast, insofern sowieso kein Focus darauf
 

Tschibo

Mitglied
Hey!

Danke fuer die Antwort@MiDniGG.

Ja, ich habe in der Tat etwas zu viel gekuerzt :D. Beim BufferedImage sollte es natuerlich:
Java:
BufferedImage bild = ImageIO.read(new File("einbild.png"));

heissen.

Innerclasses sind toll. Ich sehe keinen Grund sie nicht zu benutzen?!? Machen es fuer mich einfach Uebersichtlicher und kapseln unnoetige Details fuer die Aussenwelt ab.

Also es hat jetzt scheinbar tatsaechlich geholfen statt von MouseAdapter zu erben den MouseListener zu implementieren. Verstehe aber nicht so ganz, wieso das denn der Fall ist? Kann mir das jemand erklaeren? Der kleine Nachteil beim dabei ist ja, dass ich jetzt unnoetig leere mouseClicked()... etc Methoden da rumstehen habe. Kein grosses Problem, aber - why? ???:L

Auf jeden fall mal Danke!

@Slater
Auch ein Dankeschoen an dich. Ja, der output kommt zwei mal. Es ist definitiv nur ein Listener angekoppelt. (Sagt auch der Output deiner println, die ich reinkopiert habe)

Noch was: Habe jetzt wieder vom implementierten Interface zum Erben von MouseAdapter gewechselt, die uebrigen Methoden aber overriden gelassen. Funktioniert genauso. Immernoch die frage warum ich die uebrigen Methoden denn da leer stehen lassen muss?
 
Zuletzt bearbeitet:
S

SlaterB

Gast
siehe auch mein Posting zwischendurch,

die Änderung MouseAdapter/ MouseListener sollte keinen Unterschied machen,
wenn du es durch Hin- und Zurück-Änderung immer wieder reproduzieren kannst, dann wäre ein kleines Testprogramm nett,
sonst ist das nicht nachzuvollziehen, vermutlich mit anderen Änderungen gleichzeitig begründet, generell anderes Testumfeld usw.

edit:
im Extremfall eine Möglichkeit: MouseAdapter ist nicht die Standard-API-Klasse sondern irgendwo neu implementiert ;)
wie sieht der Import aus?

edit2:
noch ein Test:
new Error().printStackTrace();
im Listener bzw. Adapter ausführen,
den einen gesamten StackTrace für Listener posten sowie die beiden für Adapter
 
Zuletzt bearbeitet von einem Moderator:

Tschibo

Mitglied
Zum verrueckt werden. o_O
Der Import sieht so aus:
import java.awt.event.MouseAdapter;

Habe keine andere Klasse die so heisst. Noch viel bloeder: Habe so viel rumgeaendert, dass ich scheinbar wieder beim Ausgangszustand bin (wieder extends MouseAdapter und die ueberfluessigen Methoden auskommentiert) und es scheint normal zu funktionieren?!?

Ich schaetze ich muss es erstmal wieder ueber laengere Zeit testen um zu sehen, was wirklich funktioniert. Vorher hat es ab und an auch hingehauen, kann sein, dass es jetzt zufaellig so oft hintereinander klappt. Ich arbeite jetzt erstmal weiter daran, naechse Woche kommt nochmal ein Post wie es ausgegangen ist.

Auf alle Faelle danke fuer euere Zeit!
 

Ähnliche Java Themen

Neue Themen


Oben