Button bewegen

Blooper

Mitglied
Ich habe ein Problem bei der Bewegung eines Buttons.
Ich habe einen Button moveButton und einen Button setPos. Solange ich setPos gedrückt halte, soll sich moveButton um eine bestimmte Zahl nach rechts bewegen. Wenn ich den Button loslasse soll moveButton aufhören sich zu bewegen. Hier mein Ansatz:
Java:
public void actionPerformed(ActionEvent e){
		if (e.getSource() == setPos){
			isPressing = true;
			while(isPressing){
				xPos+=50;
				moveButton.setBounds(xPos, 100, 100, 30);
				if (xPos > 500){
					isPressing = false;
				}
			}
		}
	}

Hier habe ich das ganze mit 500 gelöst. Gibt es eine Funktion die abfragt ob der Button gedrückt wird?
 
Du lässt deine Schleife auf dem EDT laufen. Der EDT kann dann nicht die Position des Buttons aktualisieren.
Lager die Schleife in nen seperaten Thread aus, dann sollte das schon so funktionieren.
 
Das heißt ich soll Thread t = new Thread(actionPerformed()); einfügen, oder wie meinst du das?
Tut mir echt Leid, aber ich kenne mich da noch nicht so aus.
 
Und genau deswegen habe ich dir ja noch nen Link gepostet 😉
Da steht eigentlich alles wichtige drin. Wenn du danach immernoch fragen hast meld dich einfach wieder.
 
ein neuling soll sich gleich mit Threads beschäftigen?! und dann auch nocht in zusammenhang mit swing (welches nicht thread-safe ist?) na dann viel spaß...
@Blooper
Du musst in der methode statt den code auszuführen einen neuen Thread erstellen, der den Code enthält und diesen dann starten. In den Thread muss dann noch ein sleep eingebaut werden, damit ne fließende Bewegung zustandekommt (und der button nicht direkt am endpunkt ist).
Wenn du dann noch statt einem ActionListener einen MouseListener nimmst kannst du auch auf gedrückt und loslassen reagieren.
das würde grob so aussehen:
Java:
setButton.addMouseListener(new MouseAdapter() {
    @Override
    public void mousePressed (MouseEvent e) {
        new Thread(new Runnable() {
            public void run() {
                isPressed = true;
                while(isPressed) {
                    xPos += 10;
                    EventQueue.invokeLater(new Runnable() {
                        public void run() {
                            moveButton.setLocation(xPos, 100);
                        }
                    });
                    try {
                        Thread.sleep(50);
                    } catch (InterruptedException ex) {
                        ex.printStackTrace();
                    }
                }
            }
        }).start();
    }
    @Override
    public void mouseReleased(MouseEvent e) {
        isPressed = false;
    }
});
swing ist halt alles andere als anfängerfreundlich... :autsch:

edit: hier noch eine version mit swing.Timer, welche etwas einfacher zu verstehen ist:
Java:
final Timer timer = new Timer(50, new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        xPos += 10;
        moveButton.setLocation(xPos, 100);
    }
});
setButton.addMouseListener(new MouseAdapter() {
    @Override
    public void mousePressed (MouseEvent e) {
        timer.start();
    }
    @Override
    public void mouseReleased(MouseEvent e) {
        timer.stop();
    }
});

@ marco13
swing bietet ein paar nette Stolperfallen für anfänger an, wie getGraphics() oder das mischen mit awt-Komponenten oder eben dass alles im EDT ausgeführt werden muss.
Listener (Observer-Pattern) und Layout-Manager sind für neulinge auch nicht umbedingt trivial (GridBagLayout ist sogar für Fortgeschrittene ne herausforderung)
aber du hast schon recht, die dokumentation zu swing ist echt gut, aber auch nötig 😉

mfg Cookie
 
Zuletzt bearbeitet:
Ich finde schon, dass Swing (sehr) anfängerfreundlich ist. Abgesehen von der exzellenten Dokumentation und den ausführlichen Tutorials und Beispielen ist es IMHO relativ leicht zu benutzen. Threads, die etwas am GUI machen, sind grundsätzlich schwierig, aber mit dem klaren Statement, dass alle Änderungen nur über den EDT gemacht werden dürfen, und man das erreicht, indem man die Aufgaben mit SwingUtilities.invkokeLater auf diesen Thread legt, ist das ganze IMHO gut handhabbar.
 

Zurück
Oben