2011-09-01 7 views
1

2 초마다 표시되고 사라지는 패널에서 원을 만들려합니다. 여기 있습니다 :그래픽 구성 요소가있는 스윙 타이머

public class Board extends JPanel implements ActionListener { 

    private final int DELAY = 2000; 

    private Timer timer; 

    /* 
    * constructor 
    */ 
    public Board() { 

     setFocusable(true); 
     initGame(); 
    } 

    /* 
    * initialize board 
    */ 
    public void initGame() { 

     timer = new Timer(DELAY, this); 
     timer.start(); 

    } 

    public void paint(Graphics g) { 

     super.paint(g); 
     g.setColor(Color.gray); 
     // draw an oval starting at 20,20 with a width and height of 100 and 
     // fill it 
     g.drawOval(20, 20, 100, 100); 
     g.fillOval(20, 20, 100, 100); 

     g.dispose(); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     repaint(); 
    } 
} 

여러분 감사합니다. 이제 내 서클을 제어하고 싶습니다. 그러나 다시는 무언가 잘못되었으며 원하는대로 움직이지 않습니다.

여기에 새로운 방법은 다음과 같습니다 ...

private boolean left = false; 
private boolean right = true; 
private boolean up = false; 
private boolean down = false; 

private Timer timer; 

public int x = 20; 
public int y = 20; 
public int x2 = 100; 
public int y2 = 100; 

public void paint(Graphics g) { 

    super.paint(g); 
    if (drawCircle) { 
     g.setColor(Color.gray); 
     // draw an oval starting at 20,20 with a width and height of 100 and 
     // fill it 
     g.drawOval(x, y, x2, y2); 
     g.fillOval(x, y, x2, y2); 
    } 
    // removes native non-Java recourses 
    g.dispose(); 
} 

public void move() { 

    if (left) { 
     x -= 5; 
    } 
    if (right) { 
     x += 5; 
    } 
    if (up) { 
     y -= 5; 
    } 
    if (down) { 
     y += 5; 
    } 
} 

@Override 
public void actionPerformed(ActionEvent e) { 

    move(); 
    repaint(); 
} 

private class TAdapter extends KeyAdapter { 

    public void keyPressed(KeyEvent e) { 

     int key = e.getKeyCode(); 

     if ((key == KeyEvent.VK_LEFT) && (!right)) { 
      left = true; 
      up = false; 
      down = false; 
     } 

     if ((key == KeyEvent.VK_RIGHT) && (!left)) { 
      right = true; 
      up = false; 
      down = false; 
     } 

     if ((key == KeyEvent.VK_UP) && (!down)) { 
      up = true; 
      right = false; 
      left = false; 
     } 

     if ((key == KeyEvent.VK_DOWN) && (!up)) { 
      down = true; 
      right = false; 
      left = false; 
     } 
    } 
} 

/* ** */ 가 해결, 난 그냥 추가

addKeyListener(new TAdapter()); 
내 보드 생성자에게

!

+1

무엇이 질문입니까? Swing에서 –

+2

은 페인트를 오버라이드하지 않고 paintComponent를 오버라이드한다. – kleopatra

답변

3

Timer 상태를 수정하기 만하면됩니다. 다음과 같이 시도하십시오.

private boolean drawCircle = false; 

public void actionPerformed(ActionEvent e) { 
    drawCircle = !drawCircle; 
    repaint(); 
} 

public void paintComponent(Graphics g) { 
    //... 
    if (drawCircle) { 
     g.setColor(Color.gray); 
     //... 
    } 
} 
+2

OP :-)와 같은 코멘트 – kleopatra

2

질문을 공식화하지 않으셨습니까?

어쨌든 부울을 클래스에 추가하고, 각 액션 이벤트에서 토글하고, 참인 경우에만 타원을 페인트합니다.

편집/참고 사항 : - 페인트 대신 paintComponent 덮어 쓰기 - 작성하지 않은 Graphics는 처리하지 마십시오. 줄을 끊거나 g.create()를 사용하여 복사본을 만듭니다. 자세한 내용은 http://java.sun.com/products/jfc/tsc/articles/swing2d/을 참조하십시오.

+2

토글은 'paint'에서 발생하지 않아야한다. 왜냐하면 그 메소드가 언제 호출 될 지 예측할 수 없기 때문이다. 게임 상태를 주도하는 것은 무엇이든간에 토글해야합니다. 이 경우에는 'Timer'이다. –

+0

정말로, 내 대답을 지적 해 주셔서 고맙습니다. :-) ("각 페인트에", 타이머 동작에서 "각 페인트 트리거"를 의미했습니다) – PhiLho

+0

그에 따라 제 형식이 변경되었습니다 (추가 조언 추가). – PhiLho

관련 문제