Anfänger Problem mit Thread.sleep()

Status
Nicht offen für weitere Antworten.

el_vital

Aktives Mitglied
Ich möchte ein Bild anzeigen lassen, danach sagen wir mal 2000ms Pause und danach sollen die weiteren Anweisungen ausgeführt werden.

Es sieht bei mir so aus:

Code:
public void gameOver(){
         panelHead2.removeAll();
         JLabel feld2 = new JLabel(new ImageIcon(getClass().getResource("GameOver.jpg")));
         feld2.setLayout (new FlowLayout (FlowLayout.LEFT, 0, 0));
         panelHead2.add(feld2);
         repaint();
         validate();
         System.out.println("vor Der Pause");
       	 try {
          		   Thread.sleep(2000);     
       	  } catch (InterruptedException ex) {}
         System.out.println("Nach der Pause");
     }


Die Konsole-Ausgabe funktioniert, es kommt die Meldung “Vor der Pause” und nach 2000ms “Nach der Pause”. Das Bild GameOver.jpg wird aber nicht eingeblendet sondern irgendwie übersprungen. Nehme ich die Verzögerung raus, so wird das Bild angezeigt.
Es scheint so als ob der Thread noch vor dem darstellen des Bildes einschläft.

Wie macht man so was richtig??
 
Code:
...
public class TimerDemo extends JFrame implements ActionListener{
...
    public void gameOver(){
...
        timer = new Timer(2000, this);
        timer.start();
        System.out.println("vor Der Pause");
    }
    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == timer){
            timer.stop();
            System.out.println("Nach der Pause");
        }
    }
    private javax.swing.Timer timer;
}
 
Ok, das funktioniert super, danke! 😀
Wie kann ich es hierbei anwenden:


Code:
public void paintComponent(Graphics g) {
            super.paintComponent(g);
for (int i = 0; i < x; i++) {                
                        g.fillOval(flugParabel[0][i], flugParabel[1][i], 1, 1);
                       
                    }
}

Es wird eine Wurfparabel gezeichnet. Ich möchte, dass nach jedem Punkt eine timer Pause erfolgt. Ist es bei einem paintComponent möglich?
 
Das könnte so funktionieren:

Code:
//...

public class TimerDemo extends JFrame implements ActionListener
{

    //...

    private boolean parabelFertig;

    public void zeichneParabel()
    {
        //...
        parabelFertig = false;
        parabelTimer = new Timer(200, this);
        timer.start();
    }

    public void actionPerformed(ActionEvent e)
    {
        if(e.getSource() == parabelTimer)
        {
            if(parabelFertig)
            {
                parabelTimer.stop();
            }
            repaint();
        }
    }

    private Timer parabelTimer;
}
 
ich verstehe das Prinzip immer noch nicht. :bahnhof:

ich habe hier eine Classe die mir ein Intro langsamm einblenden soll.
Die Methode loadImage funktioniert einwandfrei.
Das Bild wird auch ganz schnell angezeigt und das wars. Die Pausen wirken nicht.

Kann mir jemand bitte helfen?

Code:
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.event.*;


class Intro extends JPanel implements ActionListener{

    private Image image ;
    private BufferedImage buffer ;
    float alpha=0.0f; //alpha Wert für das Intro (fuer die Transparenz)
    float di=0.001f; //Erhöhungsschritte des Alphawertes
    Composite a;
    private boolean introText=false;
    private Timer introTimer; 
    float temp = 0.3f;



    Intro () {
        loadImage();
        introTimer = new Timer(2000, this);
        
        //Intro-Bild langsam einblenden
       for(int i=0; i<=900; i++){
           alpha+=di;
           System.out.println("test");
           introTimer.start(); 
           timer.start(); 
           repaint();
           if(alpha>=0.08f){
               introText=true;
               break;
           }
       }

    }
    
    
    public void actionPerformed(ActionEvent e)
    {
        if(e.getSource() == introTimer)
        {
            System.out.println("introTimer");
            repaint();
            introTimer.stop();  
        }
    } 
    
    
    private Timer timer;{
        timer = new Timer(2000, new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                   System.out.println("timer");
                   repaint();
                   timer.stop();
            }
        });

    
    }
    
    

    private void loadImage() {
        image = Toolkit.getDefaultToolkit().getImage(getClass().getResource("titelbild.jpg"));
        MediaTracker mt = new MediaTracker(this) ;
        try {
            mt.addImage(image, 0) ;
            mt.waitForID(0) ;
        }catch(InterruptedException er) {}
        int imgW = image.getWidth(this) ;
        int imgH = image.getHeight(this) ;
        buffer = new BufferedImage(imgW,imgH, BufferedImage.TYPE_INT_ARGB) ;
        Graphics2D g2 = buffer.createGraphics() ;
    }
    
    
  

    

    public void paintComponent(Graphics g) {
    Graphics2D g2 = (Graphics2D) g;
    

        Composite a = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha);
        g2.setComposite(a);
        g2.drawImage(image, 0, 0, null);
        System.out.println("test2");
        repaint();

        
        if(introText==true){
            g.setColor(new Color(130, 130, 130));
            g.setFont(g.getFont().deriveFont(18F));
            g.drawString("Objektorientierte Programmierung mit Java", 170, 430);
            repaint();
            timer.start(); 
        } 
        
    }
   

}
 
Ich verstehe wo mein Problem liegt, aber ich finde keine Lösung dafür.
Das JPanel wird ja erst in der Hauptklasse dargestellt. Ich kann also in dieser Intro Klasse kein repaint() durchführen. Es mag durchaus langsam eingeblendet werden, aber in der Hauptklasse wird es schon voll gezeichnet dargestellt und zu weiteren Anweisungen übergangen.
 
Code:
/*
 * Intro.java
 */
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Intro extends JPanel {
    private Image image ;
    private float alpha=0.0f; //alpha Wert für das Intro (fuer die Transparenz)
    private float di=0.01f; //Erhöhungsschritte des Alphawertes
    private Composite a;
    private boolean introText=false;
    public Intro() {
        loadImage();
        timer.start();
    }
    private Timer timer;{
        timer = new Timer(70, new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                einblenden();
            }
        });
    }
    private void einblenden(){ 
        alpha += di; 
        if(alpha > 0.08f) introText=true; 
        if(alpha > 0.9f)  timer.stop(); 
        repaint(); 
    } 
    private void loadImage() {
        image = Toolkit.getDefaultToolkit().getImage(getClass().getResource("titelbild.jpg"));
        MediaTracker mt = new MediaTracker(this) ;
        mt.addImage(image, 0) ;
        try { 
            mt.waitForID(0) ; 
        } catch (InterruptedException ex) {} 
    }
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        Composite a = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha);
        g2.setComposite(a);
        g2.drawImage(image, 0, 0, null);
        if(introText==true){
            g.setColor(new Color(130, 130, 130));
            g.setFont(g.getFont().deriveFont(18F));
            g.drawString("Objektorientierte Programmierung mit Java", 170, 430);
        }
    }
}
 
Hallo zusammen,

ich wollte das letzte Beispiel auch mal ausprobieren. Leider weiss ich nicht wo die Ressource titelbild.jpg beim Laden erwartet wird. Ein "C:\\titelbild.jpg" bricht mit einer Exception ab, da er offenbar das Bild nicht laden kann.

Uncaught error fetching image:
java.lang.NullPointerException
at sun.awt.image.URLImageSource.getConnection(URLImageSource.java:97)
at sun.awt.image.URLImageSource.getDecoder(URLImageSource.java:106)
at sun.awt.image.InputStreamImageSource.doFetch(InputStreamImageSource.java:240)
at sun.awt.image.ImageFetcher.fetchloop(ImageFetcher.java:172)
at sun.awt.image.ImageFetcher.run(ImageFetcher.java:136)
 
Ich hab das Bild im Netbeans Projektordner im Unterordner build mal neben die Klasse gelegt und auch an ein paar anderen Stellen, aber mehr als den Rahmen mit der Schrift krige ich nicht zu sehen. Auch beschwert er sich jetzt nicht mehr beim Laden des Bildes.
 
RaoulDuke hat gesagt.:
..mehr als den Rahmen mit der Schrift krige ich nicht zu sehen. Auch beschwert er sich jetzt nicht mehr beim Laden des Bildes.
Versteh ich nicht: loadImage() enthält doch weiter nichts als deinen ursprünglicher Code ???:L
paintComponent() ist auch gleich. Und der alpha Wert wird mit timer.start() laufend erhöht und neu gezeichnet.

Versuch's mal mit diesem Bild:
Code:
import java.net.*;
import javax.imageio.*;
...
    private void loadImage() {
        try{
            URL url = new URL("http://images.thetimes.co.uk/TGD/picture/0,,223788,00.jpg");
            image = ImageIO.read(url);
        }catch(Exception ex){
            ex.printStackTrace();
        }
    }
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben