windows为什么这个Java图形不能在OS X中显示?
在课堂上,我得到了一些演示代码,这些代码在实验室的Windows电脑上运行,但在2010年的MacBook上使用Sierra的方式不同
做出Java Graphics Not Displaying In OS X中建议的更改并没有解决我的问题。我还尝试过调整窗口大小,这会稍微改变动画大小——调整大小后,它会间歇性弹出。如果我增加线程。sleep()时间并调整大小,动画会有所改善,但仍然是不稳定的
为什么代码在我的MacBook上不起作用,我怎样才能让它起作用
原始代码(适用于Windows 10,但不适用于我的Mac):
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class GraphicsTestA extends JFrame{
int x1 = 60;
int x2 = 150;
public static void main(String [] args){
GraphicsTestA gta = new GraphicsTestA();
gta.animate();
}
private void animate()
{
while(true)
{
for(int i=0; i <100; i ++)
{
x1 = x1 + 1;
x2 = x2 - 1;
try
{
Thread.sleep(100);
}
catch(Exception ex)
{}
repaint();
}
x1 = 60;
x2 = 150;
}
}
public GraphicsTestA() {
setSize(200,200);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
this.validate();
}
public void paint(Graphics g) {
super.paint(g);
g.drawString("Hello World",80,80);
g.drawLine(x1,60,x2,150);
g.drawRect(100,40,30,30);
}
}
# 1 楼答案
在swing中,不应该在swing线程之外调用swing内容。Windows可以让你摆脱一些污点,但mac上的Java对此非常挑剔
在这段代码中,构造函数进行swing调用,但它是从主线程调用的。您可以尝试将其拆分,以便Swing线程调用构造函数,但动画方法存在问题
Swing线程不应该调用animate方法,因为它正在调用
sleep()
,而暂停Swing线程是个坏主意™. 然而,它也在调用repaint()
,这是一个swing调用,需要由swing线程调用我建议您使用
EventQueue.invokeLater
构建窗口,然后找出如何使用Swing Workers或其他适当的机制来制作动画