JButtons gedrückt halten?

Angiii

Erfahrenes Mitglied
Hallo,

eigentlich dachte ich, ich könnte das folgende Problem allein lösen - aber wies halt so ist, will nichts so richtig funktionieren.

Ich habe ein Applet, in welchem unter anderem eine "Zoom"-Funktion integriert ist. Mit dieser Funktion kann ich Bilder vergrößern oder verkleinern. Dazu nutze ich zwei JButtons mit denen ich die gewünschte Zoomstufe einstellen kann. Was mich stört ist foglendes:

Wenn ich die Zoom-Funktion nutze, muss ich ständig auf das JButton drücken um den gewünschten Vergrößerungsfaktor zu erhalten. Es wäre schöner, wenn ich einfach die Maustaste auf dem Zoom-Button solange gedrückt halten könnte, bis ich die optimale Einstellung habe. Die nervige Klickerei könnte ich mir somit sparen. Denn bei gut 100 Zoomstufen, klickt man ganz schön oft.

Mein Gedanke war, das ich mit Hilfe einer while-Schleife meine Zoom-Funktion so lange ausführe, wie das Button über den ActionListener angesprochen wird. Das Ganze hängt sich leider in der while-Schleife auf....
 
Ob es eine spezielle Eigenschaft für einen JButton gibt weiß ich nicht.

Aber wenn es nur ums Klicken geht, würde ich vielleicht zu einem MouseListener greifen oder eine von JButton abgeleitete Klasse schreiben.
 
Neue Woche neues Glück. Ich bin jetzt mal hammets Rat gefolgt und habe den MouseListener ausprobiert:
Code:
boolean stopzooming = true;
	
ZoomIn.addMouseListener(new java.awt.event.MouseAdapter() {   
    public void mousePressed(java.awt.event.MouseEvent e) {    
	       stopzooming = false;
               while (stopzooming != true){
		System.out.println("click");
						
	  }
    }   
								
    public void mouseReleased(java.awt.event.MouseEvent e) {    
		stopzooming = true;
		System.out.println("mouseReleased()"); 
     }   
				
});

Ich glaube so weit bin ich nicht mehr von einer Lösung weg. Wenn ich das Zoom-Button drücke, wird eine while-Schleife gestartet, welche dann später die eigentlich Zoomfkt. ausführen soll. Diese wird da solange ausgeführt, bis die Maus wieder losgelassen wird (mouseReleaded). So weit jedenfalls die Theorie.

Leider hängt sich das Programm in der while-Schleife auf, bevor überhaupt die Maus wieder losgelassen wird. Hat da jemand an eine Idee, wie ich das Problem vermeiden kann?
 
Hallo,

du könntest auch einfach einen JSlider nutzen. So kann man mehr oder weniger genau einstellen wie weit man reinzoomen möchte.
Das ist bei einem Button etwas komplizierter, wenn man es mit einem MouseListener macht.

MFG

Sascha
 
Neue Woche neues Glück. Ich bin jetzt mal hammets Rat gefolgt und habe den MouseListener ausprobiert:
Code:
boolean stopzooming = true;
	
ZoomIn.addMouseListener(new java.awt.event.MouseAdapter() {   
    public void mousePressed(java.awt.event.MouseEvent e) {    
	       stopzooming = false;
               while (stopzooming != true){
		System.out.println("click");
						
	  }
    }   
								
    public void mouseReleased(java.awt.event.MouseEvent e) {    
		stopzooming = true;
		System.out.println("mouseReleased()"); 
     }   
				
});

Ich glaube so weit bin ich nicht mehr von einer Lösung weg. Wenn ich das Zoom-Button drücke, wird eine while-Schleife gestartet, welche dann später die eigentlich Zoomfkt. ausführen soll. Diese wird da solange ausgeführt, bis die Maus wieder losgelassen wird (mouseReleaded). So weit jedenfalls die Theorie.

Leider hängt sich das Programm in der while-Schleife auf, bevor überhaupt die Maus wieder losgelassen wird. Hat da jemand an eine Idee, wie ich das Problem vermeiden kann?

Hast du denn den Aufruf deiner Zoommethode in einen Thread gepackt? Du musst den Thread in der MousePressed-Methode starten (Thread läuft ewig weiter und ruft die Zoomenmethode auf) und in der MouseReleased-Methode stoppst du dann einfach den Thread.

Das mit dem JSlider wäre natürlich auch eine Idee, ist aber eben eine andere Benutzerführung.
 
Die Idee mit dem JSlider find ich ja auch mal interessant. Hab das gerade mal ausprobiert. Das Ganze lässt sich leichter realisieren, als mit zwei JButtons. Der Code an sich ist ziemlich simpel.
Code:
	if (Slider1().getValue() < initvalue ){
				initvalue = getSlider1().getValue();
				System.out.println("verkleinern");	
				sendCommand(ZOOM_OUT, (byte) 0x00); // Zoom-Fkt. 
	}
			
	else if (Slider1()..getValue() > initvalue ){
				initvalue = getSlider1().getValue();
				System.out.println("vergrößern");	
				sendCommand(ZOOM_IN, (byte) 0x01); // Zoom-Fkt. 
	}
Zu kämpfen habe ich bloß mit der Trägheit meiner eigenen Zoom-Funktion. Bei schneller Bewergung des JSlider Schiebereglers, kann es vorkommen, dass ich den maximalen Wertebereich der JSlider im GUI schon ausgeschöpft habe, aber in wirklichkeit noch einiges gehen würde. Kann man JSlider nicht irgendwie "träger" machen :p? Im Idealfall sollte JSlider einfach warten bis die Zoomfunktion komplett ausgeführt wurde und erst dann weitermachen. Dazu bräuchte ich aber wohl eine Checksumme, die meine Funktion im Moment nicht zurückgibt....
 
Zurück