如何使用Java中的Timer创建重复的Graphic对象

时间:2013-05-31 15:08:43

标签: java

我试图创建这个对象正在工作的Graphic对象timer / timerTask.I可以用于单个对象,但如果我创建新对象,它就无法正常工作。我想像俄罗斯方块一样工作。

这是我的代码

这是我的第一堂课?

import javax.swing.*;
import java.awt.*;
import java.util.Timer;  
import java.util.*;


public class prosek extends JPanel{
public static int boyut;  // size 
public static  int koordinatx; //coordx
public static  int koordinaty; //coordy
public static boolean tekrar; //repeat
public static int yukseklik;  //height
private Timer timer; 
private LinkedList<TimerTask> taskList=new LinkedList<TimerTask>();



public prosek(){
    yukseklik=140;
    tekrar=false;
    koordinatx=0;
    koordinaty=-20;
    boyut=20;
    startSampling();

}




@Override
public void paintComponent(Graphics g)
{
    super.paintComponent(g);
    Graphics2D g2d=(Graphics2D)g;
   g2d.setColor(Color.RED);

   g2d.fillRect(koordinatx, koordinaty, boyut+1, boyut+1);
   g2d.dispose();



}

public void moveRectangle()
{ 
    if(yukseklik<=140)
    {

     if(koordinaty<140) koordinaty=koordinaty+boyut;
       else 
       { 
           yukseklik-=20;
           stopSampling();
         }
     }
}


void startSampling(){
    TimerTask task=new TimerTask(){
        public void run() {
                moveRectangle();
                repaint();

            }
            };
        Timer timer=new Timer();
        timer.scheduleAtFixedRate(task,0, 500);
        taskList.add(task);

        }




void stopSampling(){
    if(taskList.isEmpty()){
        return;
    }
    taskList.removeFirst().cancel();

}

   }


     ------------
     That's my second class prosekt

     import javax.swing.*;
     import java.awt.*;



     public class prosekt extends JFrame {

     public prosekt(){

    Container container=getContentPane();
    container.setLayout(new GridLayout(0,1));
    container.add(new prosek());


    setSize(100,200);
    setVisible(true);
    add(container);


    }


    public static void main(String args[])
   {
prosekt p=new prosekt();

    }

    }

1 个答案:

答案 0 :(得分:0)

我对您的代码进行了一些更改。

我做的第一件事就是定义一个DropObject类。这样可以更容易地拥有多个drop对象。

以下是DropObject类的代码。这是一个基本的getter / setter模型类。我用一个Rectangle来保存放置对象的坐标和大小。

DropObject类

import java.awt.Rectangle;

public class DropObject {

    private int         yukseklik;  // height
    private Rectangle   object;

    public DropObject(int yukseklik, int x, int y, int size) {
        this.yukseklik = yukseklik;
        this.object = new Rectangle(x, y, size, size);
    }

    public int getYukseklik() {
        return yukseklik;
    }

    public void setYukseklik(int yukseklik) {
        this.yukseklik = yukseklik;
    }

    public Rectangle getObject() {
        return object;
    }

    public void setObject(Rectangle object) {
        this.object = object;
    }

}

我修改了您的JPanel班级以使用DropObject班级。我也大写Prosek,因为Java类名应该以大写字母开头。

我在moveRectangle方法中添加了新对象,因此您会看到多个对象掉落。添加新对象需要在其他地方进行。

Prosek课程

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.util.LinkedList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

import javax.swing.JPanel;

public class Prosek extends JPanel {
    private static final int        yukseklik   = 140;
    private DropObject              koordinat;
    private List<DropObject>        objects     = new LinkedList<DropObject>();
    private LinkedList<TimerTask>   taskList    = new LinkedList<TimerTask>();

    public Prosek() {
        koordinat = new DropObject(yukseklik, 0, -20, 20);
        objects.add(koordinat);
        startSampling();
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        Graphics2D g2d = (Graphics2D) g;
        g2d.setColor(Color.RED);
        for (DropObject o : objects) {
            Rectangle r = o.getObject();
            g2d.fillRect(r.x, r.y, r.width, r.height);
        }
    }

    public void moveRectangle() {
        for (int i = (objects.size() - 1); i >= 0; i--) {
            DropObject o = objects.get(i);
            Rectangle r = o.getObject();
            if (o.getYukseklik() <= 140) {
                if (r.y < 140) {
                    r.y += r.height;
                    o.setObject(r);
                } else {
                    o.setYukseklik(o.getYukseklik() - r.height);
                    // stopSampling();
                }
            }
            if ((r.y >= 70) && (r.y <= 80)) {
                objects.add(new DropObject(yukseklik, 0, -20, 20));
            }
        }
    }

    void startSampling() {
        TimerTask task = new TimerTask() {
            public void run() {
                moveRectangle();
                repaint();

            }
        };
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(task, 0, 500);
        taskList.add(task);

    }

    void stopSampling() {
        if (taskList.isEmpty()) {
            return;
        }
        taskList.removeFirst().cancel();

    }

}

我对你的主班做了一些改动。我调用了SwingUtilities invokeLater方法来确保在Event Dispatch线程上创建并使用了Swing组件。我使用了JFrame而不是JFrame。在覆盖其中一个组件方法时,只应扩展Swing组件。

构图而不是继承

Prosekt class

import java.awt.Container;
import java.awt.GridLayout;

import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class Prosekt implements Runnable {

    @Override
    public void run() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Container container = frame.getContentPane();
        container.setLayout(new GridLayout(0, 1));
        container.add(new Prosek());

        frame.setSize(100, 200);
        frame.setVisible(true);
    }

    public static void main(String args[]) {
        SwingUtilities.invokeLater(new Prosekt());
    }

}