Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
ich hoffe, ich bin hier richtig und ihr könnt mir einen Tipp geben.
Wir müssen von der Schule aus ein Roulette programmieren, das ich ja gerade noch so geschafft habe.
Jetzt würde ich aber im Hintergrund gerne eine Roulette-Animation (Youtube-Video) in das Programm einbinden. Es soll sich einfach das Roulette drehen, bis die Zahl ausgegeben wird.
Gibt es eine einfache! Möglichkeit das in Eclipse zu tun?
Vielen Dank,
ich möchte das Video ins Programm mit einbinden, so, dass das Video abspielt, während die Zahl ausgegeben wird, oder dass man im Hintergrund ein "rien ne va plus" hört.
Das wäre also mit Java Media Framework.
Ich google dann mal, aber eine Frage: Ist das kompliziert oder geht das einfach?
Vielen Dank für die Rückmeldungen, muss mir das übers Wochende noch ein bisschen anschauen.
Aber das einfachste wäre vielleicht die blinkenden Felder. Die rotierende Grafik wäre auch toll, aber ich muusss es leider erklären können :-( , und daran hakt es.
Hi,
vielleicht nochmal kurz als Erklärung zu meiner Version, schwer ist der Code eigentlich nicht (gui-Code explodiert nur leider immer so schnell auf mehrere 100 Zeilen).
Die Basis besteht aus einer Klasse die von JPanel erbt
Code:
public class RotatingImagePanel extends JPanel
und die paintComponent-Methode überschreibt (die wird von Swing verwendet um das Panel zu zeichnen, und auch diese Methode wird aufgerufen wenn man repaint() auf der Komponente aufruft).
Der Klasse übergebe ich im Konstruktor ein BufferedImage, das dann gezeichnet wird:
Java:
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.translate(this.getWidth() / 2, this.getHeight() / 2);
g2d.rotate(getImageAngle());
// alternative version falls das bild rechteckig ist
// g2d.drawImage(image, -getWidth() / 3, -getHeight() / 3,
// getWidth()/3*2,
// getHeight()/3*2, null);
// für runde bilder:
g2d.drawImage(image, -getWidth() / 2, -getHeight() / 2, getWidth(),
getHeight(), null);
}
Zuerst rufe ich die super-Methode auf, damit das normale Panel gezeichnet wird (könnte ja noch mehr drauf sein, als nur mein Bild).
Anschließend wird das graphics-Object zu einem Graphics2D-Objekt gecastet, was in Swing ohne Typüberprüfung möglich ist (das g2d-Objekt hat ein paar mehr Methoden zum zeichnen).
Durch die Translation schiebe ich das Objekt in die mitte des Panels (da das Bild auch in die Mitte soll).
Jetzt rotiere ich das Objekt um den aktuellen Gradwert der ebenfalls in der Klasse gespeichert wird (und der später von außen geändert werden kann).
Dann wird das Bild gezeichnet, da das Graphics-Objekt allerdings in der Panelmitte sitzt müssen wir natürlich wieder die halbe Breite und höhe zur Seite gehen (jetzt allerdings mit rotation), das Bild wird dann mit der Breite und Höhe des Panels gezeichnet.
Soviel eigentlich zum statischen Teil, die regelmäßigen Updates regelt die Updater-Klasse, welche Runnable implementiert und somit in einem seperaten Thread gestartet werden kann.
Der Thread wird als deamon gestartet, dadurch wird er automatisch beendet, sollte sonst kein anderer Thread mehr laufen.
Java:
public void startRotate() {
Thread t = new Thread(updater);
t.setDaemon(true);
t.start();
}
Um den Thread sauber zu beenden verwende ich einen boolean-flag (die meisten Methoden um Threads abzuschießen sind deprecated, sollten also nicht verwendet werden. Ein boolean ist meines Wissens nach für solche kurzen Endlosschleifen die einfachste Lösung).
Java:
public void run() {
running = true;
while (isRunning()) {
// Zeitintervall und Gradzahl geben das Tempo und die Bildrate
// vor
panel.setImageAngle(panel.getImageAngle() + 0.5F);
panel.repaint();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Starte ich den Thread wird die run-Methode gestartet (parallel zum normalen Programm, startet man keinen seperaten Thread friert dir die GUI ein). Am Anfang wird running auf true gesetzt, anschließend läuft der Thread in einer Endlosschleife, die alle 100ms die Rotation um 0.5 erhöht und das panel zum Neuzeichnen auffordert.
Zum stoppen setze ich running auf false und die Gradzahl zurück.
Java:
public void stopRotate() {
updater.stopRunning();
imageAngle = 0f;
repaint();
}
Dadurch läuft der Thread höchstens noch einmal durch (er könnte ja z.B. gerade im sleep() stecken), dann beendet er die Schleife, kommt am Ende der run()-Methode an und terminiert.
Dass der Updater als statische innere Klasse implementiert ist war einfach aus Platzgründen, die Klasse kann man bequem als eigene Klasse auslagern, ebenso wie die main-Methode (die einfach nur ein Fenster zusammenschnippelt mit 2 einfachen Buttons über die sich das Panel steuern lässt).