Hallo,
Ich hab eine Oberfläche, die sämtliche sleeps quasi aufaddiert und erst danach die Oberflächenänderungen durchführt, die während der sleeps stehen
hier mein code:
Die Konsolenausgaben stimmen von der Reihenfolge, also muss das Problem darin liegen, dass die Änderungen an der Oberfläche innerhalb des Listeners noch nicht angezeigt werden.
weiß jemand, wie ich das beheben kann?
Ich hab eine Oberfläche, die sämtliche sleeps quasi aufaddiert und erst danach die Oberflächenänderungen durchführt, die während der sleeps stehen
hier mein code:
Java:
package klassen;
import javax.swing.SwingUtilities;
import java.applet.Applet;
import java.applet.AudioClip;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JLabel;
import java.awt.Rectangle;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Point;
import javax.swing.ImageIcon;
import java.awt.Font;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import java.awt.*;
public class Oberflaeche extends JFrame {
private static final long serialVersionUID = 1L;
private JPanel jContentPane = null;
private JLabel karte1 = null;
private JLabel karte2 = null;
private JLabel lbSpieler = null;
private JLabel lbDealer = null;
private JLabel lbStart = null;
private JLabel lbPunkteDealer = null;
private JLabel lbSpielerPunkte = null;
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
Oberflaeche thisClass = new Oberflaeche();
thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
thisClass.setVisible(true);
}
});
}
public Oberflaeche() {
super();
initialize();
}
private void initialize() {
this.setSize(1200, 622);
this.setContentPane(getJContentPane());
this.setTitle("Oberflaeche");
}
public void karteSound() {
int r = (int) Math.round(3*Math.random()+1);
try {
AudioInputStream audioIn = AudioSystem.getAudioInputStream(getClass().getResource("/sounds/k"+r+".wav"));
Clip clip = AudioSystem.getClip();
clip.open(audioIn);
clip.start();
}
catch (Exception f){
System.out.println(getClass().getResource("/sounds/"));
}
}
private JPanel getJContentPane() {
if (jContentPane == null) {
lbSpielerPunkte = new JLabel("0", JLabel.CENTER);
lbSpielerPunkte.setFont(new Font("Dialog", Font.BOLD, 36));
lbSpielerPunkte.setForeground(Color.yellow);
lbSpielerPunkte.setBounds(new Rectangle(30, 375, 121, 76));
lbPunkteDealer = new JLabel("0", JLabel.CENTER);
lbPunkteDealer.setSize(new Dimension(121, 76));
lbPunkteDealer.setFont(new Font("Dialog", Font.BOLD, 36));
lbPunkteDealer.setForeground(Color.yellow);
lbPunkteDealer.setLocation(new Point(30, 165));
lbStart = new JLabel();
lbStart.setBounds(new Rectangle(1020, 480, 91, 31));
lbStart.setFont(new Font("Dialog", Font.BOLD, 36));
lbStart.setForeground(Color.yellow);
lbStart.setText("Start");
lbStart.addMouseListener(new java.awt.event.MouseAdapter() {
boolean in = false; // Maus im Bereich des Labels ja/nein
public void mouseEntered(java.awt.event.MouseEvent e) {
in = true;
lbStart.setForeground(Color.red);
lbStart.setFont(new Font("Dialog", Font.BOLD, 36));
}
public void mouseExited(java.awt.event.MouseEvent e) {
in = false;
lbStart.setForeground(Color.yellow);
lbStart.setFont(new Font("Dialog", Font.BOLD, 36));
}
public void mousePressed(java.awt.event.MouseEvent e) {
lbStart.setForeground(Color.blue);
lbStart.setFont(new Font("Dialog", Font.BOLD, 28));
// Soundwiedergabe Kartenmischen
try {
AudioInputStream audioIn = AudioSystem.getAudioInputStream(getClass().getResource("/sounds/shuffle.wav"));
Clip clip = AudioSystem.getClip();
clip.open(audioIn);
clip.start();
}
catch (Exception f){
System.out.println("Fehler bei der Soundwiedergabe");
}
//sleep
System.out.println("sleep 1");
try {
Thread.sleep(1000);
} catch(InterruptedException ex) {
Thread.currentThread().interrupt();
}
//Karten austeilen
karteSound();
karte1.setIcon(new ImageIcon(getClass().getResource("/bilder/herz9.jpg")));
System.out.println("Karte 1");
//sleep
System.out.println("sleep 2");
try {
Thread.sleep(500);
} catch(InterruptedException ex) {
Thread.currentThread().interrupt();
}
karteSound();
karte2.setIcon(new ImageIcon(getClass().getResource("/bilder/karoA.jpg")));
System.out.println("Karte 2");
}
public void mouseReleased(java.awt.event.MouseEvent e) {
lbStart.setForeground(Color.red);
lbStart.setFont(new Font("Dialog", Font.BOLD, 36));
if (!in){
lbStart.setForeground(Color.yellow);
}
}
});
lbDealer = new JLabel();
lbDealer.setText("Dealer");
lbDealer.setSize(new Dimension(121, 76));
lbDealer.setForeground(Color.yellow);
lbDealer.setFont(new Font("Dialog", Font.BOLD, 36));
lbDealer.setLocation(new Point(30, 75));
lbSpieler = new JLabel();
lbSpieler.setBounds(new Rectangle(30, 285, 121, 76));
lbSpieler.setForeground(Color.yellow);
lbSpieler.setFont(new Font("Dialog", Font.BOLD, 36));
lbSpieler.setText("Spieler");
karte1 = new JLabel();
karte1.setSize(new Dimension(164, 228));
karte1.setPreferredSize(new Dimension(214, 228));
karte1.setLocation(new Point(315, 315));
karte2 = new JLabel();
karte2.setLocation(new Point(360, 315));
karte2.setSize(new Dimension(164, 228));
karte2.setText("");
jContentPane = new JPanel();
jContentPane.setLayout(null);
jContentPane.setBackground(new Color(75, 143, 37));
jContentPane.add(karte1, null);
jContentPane.add(karte2, null);
jContentPane.add(lbSpieler, null);
jContentPane.add(lbDealer, null);
jContentPane.add(lbStart, null);
jContentPane.add(lbPunkteDealer, null);
jContentPane.add(lbSpielerPunkte, null);
jContentPane.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
});
}
return jContentPane;
}
}
Die Konsolenausgaben stimmen von der Reihenfolge, also muss das Problem darin liegen, dass die Änderungen an der Oberfläche innerhalb des Listeners noch nicht angezeigt werden.
weiß jemand, wie ich das beheben kann?