主(字符串[])上的Swing Timer在指定的时间后退出程序

时间:2016-04-28 16:54:03

标签: java multithreading swing timer actionlistener

我需要每2秒生成一个新的Thread。所以我尝试在Timer方法中使用main(String[])类,但我的程序在Timer构造函数中指定的毫秒之后才存在。

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

如果在Timer构造函数中我将指定3000ms,我的程序将在3秒后关闭,依此类推。

我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

  

你能给我一个例子"显示列表"?

你谈论&#34;球&#34;。你的计划需要了解什么球?可能它的位置,也许它的速度,也许它的质量。尺寸?颜色?其他的东西?它取决于你。 Ball对象的最简单实现只是一个包含public字段的类来保存所有这些信息。然后,如果Ball是动画中唯一的移动对象,那么您的显示列表可能只是List<Ball>

在一个更复杂的程序中,您的Ball课程可能是某些更通用的课程的扩展,可能是VisibleObject,然后您的显示列表将是List<VisibleObject>

  

据我所知,为了让游戏中的所有对象同时工作,他们需要Thread s。

从某种意义上说,你是对的,因为在所有Java中只有一个类可以完成任何工作,而且该类是Thread。实际上没有其他类任何事情。其他类只定义可以通过线程调用的方法。

诀窍是,将程序中的线程与它们所做的工作分离。这是Runnable界面的动机。而不是让一个对象同时 一个线程,而且描述了线程完成完成的工作,你可以有两个类;一个负责所有线程的东西(.start(),. interrupt(),。join(),...),另一个描述要完成的工作(.run())。

有人说,编写一个包含太多类/对象的程序很难,但写一个太少的程序很容易。

只要您的Ball个对象或您的VisibleObject个对象干净地描述了您希望在屏幕上看到的内容以及您希望看到这些内容移动的方式,就会有&#39;没有理由为什么每个人的方法必须由自己的专用线程调用。您没有理由不能只使用一个线程来为每个线程进行计算。