Java程序在MAC上无法正常运行

时间:2014-10-29 20:03:41

标签: java swing concurrency jframe

我最近开始使用mac进行开发,我遇到了一个奇怪的问题。

参加以下计划:

public class Driver {

    public static void main(String [ ] args) {
        SolarSystem SSpanel = new SolarSystem(600, 600);
        SSpanel.drawSolarObject(0, 0, 30, "YELLOW");
    }
}

SolarSystem类扩展了JFrame,基本上在创建新的SolarSystem时,它会生成一个这样大小的面板。

drawSolarObjects基本上绘制了一定颜色和大小的圆。 finishedDrawing实际上使对象出现在面板上。

上面的示例确实有效但我有更复杂的要求,需要将其放入while循环中。

这就是它变得奇怪的地方,如果我在Windows计算机上使用cmd运行以下程序它可以正常工作并将黄色圆圈打印到屏幕上。在我的Mac上,添加这个while循环会导致它只是创建面板而不是绘制黄色圆圈。

public class Driver{

    public static void main(String [ ] args) {
        boolean oMove = true;
        SolarSystem SSpanel = new SolarSystem(600, 600);
        while(oMove){
            SSpanel.drawSolarObject(0, 0, 30, "YELLOW");
            SSpanel.finishedDrawing();
        }
    }
}

我在我的循环中放了一个打印件来检查它是否正在运行它,这表明它确实在循环中运行。

有谁知道造成这种情况的原因是什么?

我正在添加功能,以便您可以获得更好的图片

SolarSystem Constructer:

public SolarSystem(int width, int height)
{
    this.width = width;
    this.height = height;

    this.setTitle("The Solar System");
    this.setSize(width, height);
    this.setBackground(Color.BLACK);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setVisible(true);      
}

drawSolarObject功能:

public void drawSolarObject(double distance, double angle, double diameter, String col)
{
    Color colour = this.getColourFromString(col);
    double centreOfRotationX = ((double) width) / 2.0; 
    double centreOfRotationY = ((double) height) / 2.0; 

    double rads = Math.toRadians(angle);
    double x = (int) (centreOfRotationX + distance * Math.sin(rads)) - diameter / 2;
    double y = (int) (centreOfRotationY + distance * Math.cos(rads)) - diameter / 2;

    synchronized (this)
    {
        if (things.size() > 1000)
        {
            System.out.println("\n\n");
            System.out.println(" ********************************************************* ");
            System.out.println(" ***** Only 1000 Entities Supported per Solar System ***** ");
            System.out.println(" ********************************************************* ");
            System.out.println("\n\n");

            this.dispatchEvent(new WindowEvent(this, WindowEvent.WINDOW_CLOSING));
        }
        else
        {
            SolarObject t = new SolarObject((int)x, (int)y, (int)diameter, colour);
            things.add(t);
        }
    }
}

finishedDrawing函数:

public void finishedDrawing()
{
    try
    {
        this.repaint();
        Thread.sleep(30);
    }
    catch (Exception e) { }

    synchronized (this)
    {
        things.clear();
    }
}

这一切在Windows PC上运行良好

1 个答案:

答案 0 :(得分:2)

您的代码可能会占用Swing事件线程,阻止它在您的GUI上绘图,并有效地冻结您的程序。而是使用Swing Timer而不是while循环来实现目标。

如,

final SolarSystem SSpanel = new SolarSystem(600, 600);
int timerDelay = 100;
new Timer(timerDelay, new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        // do repeated action in here
    }
}).start();

顺便说一句,我打算放置,

SSpanel.drawSolarObject(0, 0, 30, "YELLOW");
SSpanel.finishedDrawing();

在我的计时器代码中,但它没有意义,因为这段代码不是“动态的”,不会改变任何东西或做任何动画。