在javaapplet中连续绘制图像
我正在尝试在小程序上绘制大约100幅图像。当我这样做的时候,我无法看到图像,因为过程太快了。所以我添加了睡眠功能,这样我就可以在从一个图像过渡到另一个图像之间暂停。但这不正常。我看不到任何图片,我想睡眠被一次又一次地召唤。请帮忙在javaapplet中连续绘制图像,java,animation,applet,awt,event-dispatch-thread,Java,Animation,Applet,Awt,Event Dispatch Thread,我正在尝试在小程序上绘制大约100幅图像。当我这样做的时候,我无法看到图像,因为过程太快了。所以我添加了睡眠功能,这样我就可以在从一个图像过渡到另一个图像之间暂停。但这不正常。我看不到任何图片,我想睡眠被一次又一次地召唤。请帮忙 这是我的代码: public class Test extends Applet { public void init() { setSize(1000,1000); } public void make(Graphics g,int i) { }
这是我的代码:
public class Test extends Applet
{
public void init()
{
setSize(1000,1000);
}
public void make(Graphics g,int i)
{
}
public void paint(Graphics g)
{
int i=0;
for(i=0;i<100;i++)
{
if(i!=65)
{
Image img = getImage(getDocumentBase(), "abc"+i+".png");
g.drawImage(img, 0, 0, this);
try
{
Thread.sleep(1000);
}
catch(Exception exception)
{
}
}
}
}
}
公共类测试扩展小程序
{
公共void init()
{
设置大小(10001000);
}
公共无效标识(图形g、int i)
{
}
公共空间涂料(图g)
{
int i=0;
for(i=0;isleep
将冻结EDT(事件调度线程)。由于Swing是单线程框架,任何阻塞(如sleep)的内容都会阻止EDT运行,因为paint
是从EDT的上下文调用的。不要使用sleep,而是使用
另一个注意事项是,捕获异常而不处理它是一种不好的做法。这将隐藏代码中可能发生的严重意外情况,至少打印错误消息。不要使用Thread.sleep()
,因为它将冻结Swing应用程序
相反,您应该使用javax.swing.Timer
有关更多信息和示例,请参阅Java教程和。您应该做什么
不要直接在小程序上绘图。在像JPanel这样的单独面板上绘图,并将其添加到小程序中
不要调用sleep(),因为它会阻止EDT。所有Swing组件都绘制在EDT上,因此如果它被阻止,将导致问题
也有人尝试使用单独的线程,但这不是一个好的选择,因为线程会休眠一段时间,然后错误地调用repaint()。最好使用javax.swing.Timer,它会在一段时间后触发事件
试试这个代码
public class Test extends JApplet {
int imgNo = 0;
BufferedImage bi;
JPanel p = new JPanel(){
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(Color.white);
g.fillRect(0, 0, getWidth(), getHeight());
if(bi != null)
g.drawImage(bi, 0, 0, null);
}
};
Timer t;
@Override
public void init() {
super.init();
setSize(400,400);
t = new Timer(1000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try{
if(imgNo != 65)
bi = ImageIO.read(new File("abc"+i+".png"));
}catch(Exception e){
e.printStackTrace();
}
imgNo++;
p.repaint();
}
});
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
p.setOpaque(true);
p.setBackground(Color.white);
setContentPane(p);
}
});
}
@Override
public void start() {
super.start();
t.start();
}
@Override
public void stop() {
super.stop();
t.stop();
}
}
当我在计时器的ActionListener中读取文件中的图像时,我的代码中仍然存在一个缺点。对于初学者来说,现在还可以,但我建议您使用SwingWorker,它将在启动小程序之前加载图像。我稍后将提供此升级为什么您捕获异常而不打印/ha处理它?这将隐藏异常,您将不知道是否发生意外。尝试避免这种情况,这是一种不好的做法。对此表示抱歉。我实际上是一名初学者。以后会小心处理..我问的问题上有什么帮助吗?1)为什么要编写小程序?如果这是由于您的导师的规范,请参考。2)为什么要使用AWT组件而不是Swing?请参阅许多放弃AWT的好理由。您可以提供易于理解的任何链接!!在我的回答中提供谢谢在Maroun的建议后我做了同样的事情…!!谢谢帮助!