简体   繁体   中英

Swing Timer on main(String[]) exits the program after the time specified

I need to generate a new Thread every 2 seconds. So I tried to use the Timer class in the main(String[]) method but my program just exists after the milliseconds I specified in the Timer constructor.

Program.java :

public class Program
{
    private static int panelWidth;
    private static int panelHeight;

    private static MyPanel panel = new MyPanel();

    public static void main(String[] args) 
    {   
        MyFrame frame = new MyFrame();
        frame.add(Program.panel);

        Program.panelWidth = frame.getWidth();
        Program.panelHeight = frame.getHeight();

        Timer generateBallTimer = new Timer(2000, new GenerateBalls());
        while (true)
        {
            generateBallTimer.start();
        }



    } // End of main method


    /**
     * Generate a new ball every 2 seconds.
     *
     */
    public static class GenerateBalls implements ActionListener
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {
            Program.generateBalls();
        }
    }

    public static void generateBalls()
    {
        // Generate a ball each 2 seconds
        while (true)
        {
            Program.panel.balls.add(new Ball(Program.panel));
        }
    }



} // End of program class

If in the Timer constructor I will specify 3000ms my program will be closed after 3 seconds and so on.

What am I doing wrong here?

Can you give me example of that "display list"?

You talk about "balls". What does your program need to know about a ball? Probably its position, maybe its speed, maybe its mass. Size? color? other stuff? It's up to you. The simplest implementation of a Ball object would just be a class with public fields to hold all of that information. Then, if Ball is the only kind of moving object in your animation, then your display list could just be a List<Ball> .

In a more complicated program, your Ball class might be an extension of some more general class, maybe VisibleObject , and then your display list would be a List<VisibleObject> .

As far as I know,for all the objects in a game to work concurrently they need to be Thread s.

In a sense, you are right because there is only one class in all of Java that can do any work at all, and that class is Thread . No other class actually ever does anything. Other classes merely define methods that can be called by threads.

The trick is, to decouple the threads in the program from the work that they do. That's the motivation for the Runnable interface. Instead of having one object that both is a thread and also, describes the work to be done by the thread, you can have two classes; One takes care of all the thread-y stuff (.start(), .interrupt(), .join(), ...), and the other describes the work to be done (.run()).

Some say, it's hard to write a program that has too many classes/objects, but it's easy to write one that has too few.

As long as your Ball objects or your VisibleObject objects cleanly describe the things that you want to see on the screen and the ways in which you want to see those things move, there's no reason why each one's methods must be called by its own dedicated thread. There's no reason why you can't have just one thread that does the calculations for each one in its turn.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM