我最近开始使用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上运行良好
答案 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();
在我的计时器代码中,但它没有意义,因为这段代码不是“动态的”,不会改变任何东西或做任何动画。