# Würfelanimation icon updaten



## S.T.O.R.M. (7. Sep 2011)

Hallo,

ich möchte gernen einen Würfel erstellen. Dazu möchte ich einfach Bilder wechseln, die dann jedes mal upgedatet werden. Aber genau hier liegt mein Problem. Nur das letzte Bild wird angezeigt. Habe schon viel ausprobiert, aber irgendwie bekomme ich es nicht hin. Wie mache ich das mit Threads? 


```
import java.awt.EventQueue;
import java.awt.Image;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

public class Wuerfel extends JFrame {

	private JPanel contentPane;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Wuerfel frame = new Wuerfel();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public Wuerfel() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 86, 94);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);

		final JLabel wuerfel_label = new JLabel("");
		wuerfel_label.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				EventQueue.invokeLater(new Runnable() {
					public void run() {
						double neuzeit = 10;
						double besch = 0.2;
						double gesamt = neuzeit;
						while (gesamt < 3000) {
							try {
								int zahl = ertragsWuerfel();
								System.out.println(zahl);
								wuerfel_label.setIcon(new ImageIcon(new ImageIcon("\wR"+ zahl + ".jpg").getImage().getScaledInstance(60, 60, Image.SCALE_SMOOTH)));
								Thread.sleep(new Double(neuzeit).intValue());
								neuzeit += neuzeit * besch;
								gesamt += neuzeit;
							} catch (InterruptedException e1) {
								e1.printStackTrace();
							}
						}
					}
				});
			}
		});
		contentPane.setLayout(null);
		wuerfel_label.setBounds(26, 0, 60, 60);
		contentPane.add(wuerfel_label);
		wuerfel_label.setIcon(new ImageIcon("\wR1.jpg"));
	}

	// Wuerfeln
	public int ertragsWuerfel() {
		return (int) (Math.random() * 6 + 1);
	}

}
```


----------



## Volvagia (7. Sep 2011)

Wie soll er denn neu zeichnen, wenn du den Vorgang im EDT durchführst? (Standartlistener werden sowieso standartgemäß im EDT ausgeführt.)
Benutze einen Thread.

"wuerfel_label" ist ein sehr schlechter Name. Und NullLayout im allgemeinen.


----------



## S.T.O.R.M. (7. Sep 2011)

Danke für die Antwort. Kannst du mir denn helfen, wie ich das mit dem Thread mache?


----------



## Volvagia (7. Sep 2011)

```
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.Image;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.concurrent.TimeUnit;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

public class Wuerfel extends JFrame
{
	private static final Icon[] DICE_ICONS = { //Warum nicht gleich Bilder mit 60px²? Oo
			new ImageIcon(new ImageIcon("wR1.jpg").getImage().getScaledInstance(60, 60, Image.SCALE_SMOOTH)),
			new ImageIcon(new ImageIcon("wR2.jpg").getImage().getScaledInstance(60, 60, Image.SCALE_SMOOTH)),
			new ImageIcon(new ImageIcon("wR3.jpg").getImage().getScaledInstance(60, 60, Image.SCALE_SMOOTH)),
			new ImageIcon(new ImageIcon("wR4.jpg").getImage().getScaledInstance(60, 60, Image.SCALE_SMOOTH)),
			new ImageIcon(new ImageIcon("wR5.jpg").getImage().getScaledInstance(60, 60, Image.SCALE_SMOOTH)),
			new ImageIcon(new ImageIcon("wR6.jpg").getImage().getScaledInstance(60, 60, Image.SCALE_SMOOTH))
	};
	
	private boolean rolling;
	private JLabel wuerfelLabel;
 
	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Wuerfel frame = new Wuerfel();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}
 
	/**
	 * Create the frame.
	 */
	public Wuerfel()
	{
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		JPanel contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		contentPane.setLayout(new FlowLayout());
		setContentPane(contentPane);
 
		wuerfelLabel = new JLabel(DICE_ICONS[0]);
		wuerfelLabel.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				if(rolling)
					return;
				letTheDiceRoll();
			}
		});
		contentPane.add(wuerfelLabel);
		
		pack();
	}
	private void letTheDiceRoll()
	{
		rolling = true;
		new Thread() {
			public void run() {
				double neuzeit = 10;
				double besch = 0.2;
				double gesamt = neuzeit;

				while (gesamt < 3000)
				{
					try {
						final int rand = ertragsWuerfel();
                        
						EventQueue.invokeLater(new Runnable() {
							public void run()
							{
								wuerfelLabel.setIcon(DICE_ICONS[rand]);	
							}
						});
                        
						TimeUnit.MILLISECONDS.sleep((long) neuzeit);
                        
						neuzeit += neuzeit * besch;
						gesamt += neuzeit;
					} catch (InterruptedException e1) { }
				}
				rolling = false;
			}
		}.start();		
	}
	
	// Wuerfeln
	public int ertragsWuerfel() {
		return (int) (Math.random() * 5 + 1);
	}
}
```


----------



## S.T.O.R.M. (7. Sep 2011)

Hallo,
vielen vielen Dank, funktioniert super! Ich werde mir das Prinzip nochmal genauer ansehen, damit ich es auch verstehe. Danke!


----------



## trez (8. Sep 2011)

Hm, ich dachte ich kann was lernen, aber ....

Was läuft da falsch?
(Da läuft der unveränderte Code von oben)


----------



## jgh (8. Sep 2011)

wahrscheinlich hast du die Icons/Bilder nicht^^
wR1.jpg usw


----------



## trez (8. Sep 2011)

Eigentlich logisch - aber es ist ein Naturgesetzt - wenn die Augen fehlen, und sind es auch nur die eines Wüfels, ist man blind


----------



## jgh (8. Sep 2011)

trez hat gesagt.:


> Eigentlich logisch - aber es ist ein Naturgesetzt - wenn die Augen fehlen, und sind es auch nur die eines Wüfels, ist man blind



nette Wortspielerei :toll:


----------

