Hallo Leute, ich habe folgendes Problem:
Ich will eine GUI für ein Menü erstellen; die GUI soll hauptsächlich aus drehbaren Elementen bestehen. Man kann sich das evtl. wie einen Lautstärkeregler vorstellen. Zuerst Lade ich dazu ein Bild in ein BufferedImage und drehe es dann mit einem Timer um einen bestimmten Winkel. Das Problem das ich nun habe, ist, dass das Bild bei erneuter Drehung durch den Timer wieder aus der Anfangsposition anfängt. Also wenn ich z.B. erst um 45° drehe und dann nochmals weiter drehen möchte, beginnt leider alles wieder bei 0°. Irgendwie muss ich das Bild also nach der Drehung "einfrieren" oder cachen...
Hier mal paar Code-Schnippsel:
bin für jeden tip dankbar!
Ich will eine GUI für ein Menü erstellen; die GUI soll hauptsächlich aus drehbaren Elementen bestehen. Man kann sich das evtl. wie einen Lautstärkeregler vorstellen. Zuerst Lade ich dazu ein Bild in ein BufferedImage und drehe es dann mit einem Timer um einen bestimmten Winkel. Das Problem das ich nun habe, ist, dass das Bild bei erneuter Drehung durch den Timer wieder aus der Anfangsposition anfängt. Also wenn ich z.B. erst um 45° drehe und dann nochmals weiter drehen möchte, beginnt leider alles wieder bei 0°. Irgendwie muss ich das Bild also nach der Drehung "einfrieren" oder cachen...
Hier mal paar Code-Schnippsel:
Code:
public BufferedImage getImage() {
try {
image = ImageIO.read(new File("src/icons/oben4.jpg"));
}
}
catch (IOException e) {
e.printStackTrace();
}
return image;
}
Code:
private JPanel getPanel() {
if (a == null) {
a = new JPanel();
labelA = new JLabel(new ImageIcon(getImage()));
a.add(labelA);
a.setBounds(0,0,800,800);
a.setVisible(true);
}
return a;
}
Code:
public static BufferedImage rotation(BufferedImage image, double angle) {
double sin = Math.abs(Math.sin(angle)), cos = Math.abs(Math.cos(angle));
int w = image.getWidth(), h = image.getHeight();
int neww = (int)Math.floor(w*cos+h*sin), newh = (int)Math.floor(h*cos+w*sin);
GraphicsConfiguration gc = getDefaultConfiguration();
BufferedImage result = gc.createCompatibleImage(neww, newh, Transparency.TRANSLUCENT);
Graphics2D g = result.createGraphics();
g.translate((neww-w)/2, 0/2);
g.rotate(angle, w/2, h/2);
g.drawRenderedImage(image, null);
g.dispose();
return result;
}
Code:
public static GraphicsConfiguration getDefaultConfiguration() {
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gd = ge.getDefaultScreenDevice();
return gd.getDefaultConfiguration();
}
Code:
public void startTimer() {
timer = new Timer(20, new ActionListener(){
double angle = 0;
public void actionPerformed(ActionEvent evt) {
angle += Math.PI/20;
labelA.setIcon(new ImageIcon(rotation(image, angle)));
counter++;
if (counter == 10){
timer.stop();
}
}
});
timer.start();
}
bin für jeden tip dankbar!