1

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

MadProgrammer
  • 343,457
  • 22
  • 230
  • 366
Jakob W.
  • 288
  • 1
  • 10

1 Answers1

1

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?

Community
  • 1
  • 1
MadProgrammer
  • 343,457
  • 22
  • 230
  • 366