有两个java文件Animate和Anim1.Anim1文件有JFrame,我想附加Animate文件,它具有屏幕滚动的文本逻辑(应该是JFrame屏幕)。但是我找不到一个way.And代码抛出以下编译时错误 - 线程“Thread-0”中的异常java.lang.Error:未解决的编译问题: 对于类型Animation
,方法repaint()未定义import java.awt.Graphics;
public class Animation implements Runnable {
int x=500;
String s="hello world";
public void run(){
while(true){
repaint();
try{
Thread.sleep(50);
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
public void paint(Graphics g){
g.drawString("hello world", x,-10 );
x--;
if(x< -100){
x=500;
}
}
}
import java.awt.Component;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Anim1 {
public static void main(String[] args){
Animation a= new Animation();
Thread t= new Thread(a);
t.start();
JFrame frame= new JFrame("animate");
frame.setVisible(true);
frame.setSize(400,400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
答案 0 :(得分:5)
重绘方法可以在Swing组件中找到 - 对于paint和paintComponent也是如此。除非你在另一个作为组件的对象上进行重绘调用,否则在不扩展Swing comopnent的类中调用它是没有意义的。同样地给一个非组件类一个paint方法是没有意义的,因为你没有覆盖任何绘制方法。
可能你的Animation类应扩展JPanel ,以便它可以覆盖paintComponent(不画图),以便repaint()
调用有意义。此外始终预先挂起您的绘画方法(或您认为覆盖父方法的任何其他方法)与@Override
注释。这样,当您没有正确地(或根本不)覆盖方法时,编译器会向您抱怨。你还想在你的覆盖中调用super的绘画方法。
最重要的是:阅读Swing绘画教程,因为它们都在那里解释。查看:Performing custom painting
你的绘画方法看起来像这样:
@Override
protected void paintComponent(Graphics g) {
// always call the super's method to clean "dirty" pixels
super.paintComponent(g);
// then draw the String. Make y a field too, so it can be controlled
// more easily
g.drawString(s, x, y);
}
请注意,我不会更改x值或在我的绘制方法中调用任何状态更改代码,这是设计的。 paintComponent方法仅用于绘制 。您无法完全控制是否调用它,甚至可以调用它,并且可以称为多次次。
相反,x值应该在“游戏循环”中更改,这里是Runnable的run()
方法。另外,根据我的评论,虽然可以使用Thread / Runnable创建此代码,但是更安全而不是使用Swing Timer来驱动动画,因为这样可以避免担心关于Swing线程问题。
答案 1 :(得分:0)
也许.repaint()需要传递一些东西才能工作。通常动画会在画布上进行,然后你会更新它。更新方法必须与您要更新的所有内容分开。
canvas.update()
public void update(){
what it is you wish to update
canvas.draw()
}
我希望这会有所帮助。编辑所以你的画布是你的JFrame