Jakob W.
Jakob W.

Reputation: 318

sleep pauses whole Thread

I know my code isnt like written following the java conventions, but its just a little test... Ive got a JFrame in my class MainNF. This JFrame should show up and then disappear for a amount of time, which is entered in the JTextField jtf, while another frame, the NFrame frameZero, appears. After that, it should come up again and the frameZero should disappear. So I just need code that pauses my method for an amount of time.

My Problem: If tried it with Thread.sleep(), but the problem here is the whole Thread then sleeps, so the NFrame frameZero doesnt do anything at this time. I also tried it with the wait() method, this didnt work either.

My Code:

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

public class MainNF{

    public static void main(String[]args){
        MainNF m=new MainNF();
    }

    JTextField jtf;
    JFrame j;
    JPanel acd;
    JPanel [] eingabe;
    JButton play;
    int letzterScore;

    public MainNF(){
        j=new JFrame("Menue");
        acd=new JPanel();
        letzterScore=0;
        acd.add(new JLabel("Letzter Score: "+letzterScore));
        j.add(acd);

        eingabe=new JPanel[2];
        eingabe[0]=new JPanel();
        eingabe[1]=new JPanel();
        eingabe[1].setLayout(new BoxLayout(eingabe[1], BoxLayout.Y_AXIS));
        eingabe[1].add(new JLabel("Sekunden fuer das naechste Spiel"));
        jtf=new JTextField();
        eingabe[1].add(jtf);
        eingabe[0].setLayout(new BoxLayout(eingabe[0], BoxLayout.X_AXIS));
        eingabe[0].add(eingabe[1]);
        play=new JButton("Los!");
        play.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){
            j.setVisible(false);
            letzterScore=play(getPlaytime());
            j.setVisible(true);
        }});
        eingabe[0].add(play);
        j.add(eingabe[0]);
        j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        j.setBounds(200, 200, 400, 400);
        j.setVisible(true);
    }

    public int play(){
        NFrame frameZero=new NFrame();
        try{
            Thread.sleep(getPlaytime());
        }
        catch(InterruptedException e){}
        frameZero.setAllInvisible();
        return frameZero.amount();
    }

    public int getPlaytime(){
        return Integer.parseInt(jtf.getText());
    }

}

Last I tried it with a timer, but that didnt pause anything at all:

public int play(){
    NFrame frameZero=new NFrame();
    ActionListener taskPerformer = new ActionListener() {
    public void actionPerformed(ActionEvent evt) {

    }};
    Timer t = new Timer(getPlaytime(), taskPerformer);
    t.setRepeats(false);
    t.start();
    frameZero.setAllInvisible();
    return frameZero.amount();
}

So I havent any clue what to do... ...would love you if you could help me <3

Upvotes: 1

Views: 55

Answers (1)

MadProgrammer
MadProgrammer

Reputation: 347184

public int play() is been called from within the context of the Event Dispatching Thread, which is preventing it from, amongst other things, process repaint requests and new events.

Use a Swing Timer instead, see How to use Swing Timers for more details

You might also consider having a look at Concurrency in Swing and The Use of Multiple JFrames, Good/Bad Practice?

Upvotes: 1

Related Questions