编写程序以使用java swing滚动文本

时间:2017-01-27 20:33:24

标签: java swing animation

有两个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);


    }
}

2 个答案:

答案 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