2013-05-31 8 views
0

이 객체가 작동하는 그래픽 객체를 만들려고했습니다. timer/timerTask.I는 단일 객체에서 작동하지만 새 객체를 만들면 원하는대로 작동하지 않습니다. . 나는 그것을 테트리스처럼 일하고 싶다.Java에서 타이머를 사용하여 반복적 인 그래픽 객체를 만드는 방법

는 여기에 내가 코드를 일부 변경 한 내 최고 수준의 prosek

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(); 

    } 

    } 
+0

? 하나의 TimerTask가 배포되었거나 모두가 표시되어 있습니까? – gobernador

답변

0

의 내 코드

입니다.

내가 한 첫번째 작업은 DropObject 클래스를 정의하는 것이 었습니다. 이렇게하면 두 개 이상의 객체를 놓는 것이 더 쉬워집니다.

다음은 DropObject 클래스의 코드입니다. 기본 getter/setter 모델 클래스입니다. Rectangle을 사용하여 놓기 객체의 좌표와 크기를 유지했습니다.

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; 
    } 

} 

DropObject 클래스는 내가 DropObject 클래스를 사용하도록 JPanel 클래스를 수정했습니다. 또한 Java 클래스 이름은 대문자로 시작해야하기 때문에 Prosek을 대문자로 사용했습니다.

새 개체를 moveRectangle 메서드에 추가 했으므로 둘 이상의 개체가 떨어지는 것을 볼 수 있습니다. 새로운 객체의 추가는 다른 곳에서 일어나야합니다.

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(); 

    } 

} 

Prosek 클래스는 나는 당신의 메인 클래스의 일부를 변경했다. SwingUtilitiesinvokeLater 메서드를 호출하여 Swing 구성 요소가 만들어져 Event Dispatch 스레드에서 사용되었는지 확인했습니다. JFrame을 확장하는 대신 JFrame을 사용했습니다. 구성 요소 메소드 중 하나를 재정의 할 때만 Swing 구성 요소를 확장해야합니다. 상속을 통해

구성

Prosekt 클래스 코드가 현재 무엇입니까

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()); 
    } 

} 
관련 문제