Hallo zusammen,
ich möchte innerhalb eines Panels eine Grafik rotieren lassen. Dafür habe ich die paintComponent überschrieben und drehe das Bild immer ein paar Grad weiter.
In der main() erzeuge ich mir eine Instanz und rufe direkt die rotate-Methode (innerhalb von rotate wird das Panel zum neu zeichnen veranlasst) auf. Dies klappt auch super und die Grafik rotiert.
Nun gibt es noch eine Schaltfläche innerhalb des Fensters, welche ebenfalls rotate() aufruft. Das Problem ist nun, das zwar rotate() nach betätigen der Schalftfläche aufgerufen wird, jedoch paintComponent nur einmal durchlaufen wird.
Wie kann das sein? Hat jemand eine Idee? Bin echt ratlos, da es ja einmal funktioniert und beim anderen mal nicht!
ich möchte innerhalb eines Panels eine Grafik rotieren lassen. Dafür habe ich die paintComponent überschrieben und drehe das Bild immer ein paar Grad weiter.
In der main() erzeuge ich mir eine Instanz und rufe direkt die rotate-Methode (innerhalb von rotate wird das Panel zum neu zeichnen veranlasst) auf. Dies klappt auch super und die Grafik rotiert.
Nun gibt es noch eine Schaltfläche innerhalb des Fensters, welche ebenfalls rotate() aufruft. Das Problem ist nun, das zwar rotate() nach betätigen der Schalftfläche aufgerufen wird, jedoch paintComponent nur einmal durchlaufen wird.
Wie kann das sein? Hat jemand eine Idee? Bin echt ratlos, da es ja einmal funktioniert und beim anderen mal nicht!
Code:
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.AffineTransform;
import javax.swing.*;
public class RepaintTest extends JFrame{
// auf dieses Panel soll gezeichnet werden
JPanel panel;
// aktueller Drehwinkel
int curAngel = 0;
public RepaintTest()
{
super();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
// erzeuge Panel
panel = new JPanel() {
protected void paintComponent( Graphics g ) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
AffineTransform orgForm = g2d.getTransform();
AffineTransform newForm = (AffineTransform) orgForm.clone();
newForm.rotate(Math.toRadians(curAngel), 75, 75);
g2d.setTransform(newForm);
g2d.drawRect(10, 10, 100, 100);
g2d.setTransform(orgForm);
}
};
panel.setPreferredSize(new Dimension(100, 100));
add(panel, BorderLayout.CENTER);
// Schaltfläche um Rotation von Hand anzustoßen
JButton btn = new JButton("Knopf!");
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
rotate();
}
});
add(btn, BorderLayout.SOUTH);
setSize(200,200);
setLocationRelativeTo(null);
// render GUI
setVisible(true);
}
public void rotate() {
System.out.println("callRepaint");
while(curAngel < 360) {
panel.repaint();
curAngel += 10;
try {
Thread.sleep(25);
} catch (InterruptedException e) {}
}
curAngel = 0;
System.out.println("Fertig");
}
public static void main(String[] args) {
new RepaintTest().rotate();
}
}