ActionListener有效,但绘画并没有

时间:2015-06-25 16:58:27

标签: java awt actionlistener paintcomponent

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


public class Game extends JComponent implements ActionListener {
    Timer t = new Timer(5, this);
    int wx;
    int rx = 10;
    int rx2 = 10;
    int carx = 10;
    int velX = 2;

    public static void main(String[] args) {
        JFrame window = new JFrame("Frogger");
        window.add(new Game());
        window.pack();
        window.setSize(800, 600);
        window.setLocationRelativeTo(null);
        window.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        window.setVisible(true);


    }
    public void actionPerformed(ActionEvent e){
        carx+=velX;
        repaint();
    }


    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        repaint();
        g.setColor(new Color(173, 216, 230));
        g.fillRect(0, 0, 800, 600); //background
        g.setColor(Color.lightGray);
        g.fillRect(0, 525, 800, 75); //start
        g.fillRect(0, 0, 800, 30); //end
        g.setColor(Color.black);
        g.fillRect(0, 275, 800, 250); //street
        g.setColor(Color.white);
        for (int n = 0; n < 16; n++) {
            g.fillRect(rx, 450, 20, 10);
            rx += 50;
        }
        for (int n = 0; n < 16; n++) {
            g.fillRect(rx2, 375, 20, 10);
            rx2 += 50;
        }
        g.fillRect(carx, 477, 60, 30);
        t.start();

    }

}

我正在尝试制作Frogger游戏并且无法创建流量。我可以让汽车在街对面移动,但分隔车道的线条显示为毫秒,然后在我运行程序后消失。街道,河流,开始和结束都出现在我想要的地方。如何使车道线不消失?

1 个答案:

答案 0 :(得分:0)

你正在做的事情有几个问题。

首先,每次绘制组件时都调用t.start()。这是不必要的。而不是这样做,创建一个布尔值,确定它是否是第一帧,然后启动它。以下是如何做到这一点:

boolean firstFrame = true;

@Override
public void paintComponent(Graphics g){
    super.paintComponent(g);
    if(firstFrame){
        t.start();
        firstFrame = false;
    }
    //rest of render code...
}

现在您的问题是如何阻止线条消失。您似乎将整数rxrx2存储为Game类的成员。这意味着当您添加它们时,它们会一直保持添加状态直到重置因此,每一帧,您必须将rxrx2重置为10。

paintComponent结束时,添加此内容。

rx = rx2 = 10;

这会将rxrx2都设置为起始值10。