2011-08-09 4 views
0

문자열을 임의의 위치에 그려야하고 새로운 위치로 점프하지만 그 자체의 흔적은 남기고 싶습니다.자바 캔버스 drawstring

java에 "스탬프"명령이없는 것 같습니다.

어떻게하면됩니까?

지금까지 나는 임의의 문자로 점프하지만 그 자체의 복사본은 남기지 않습니다.

import java.awt.Canvas; 
import java.awt.Graphics; 
import java.util.Random; 

import javax.swing.JFrame; 

@SuppressWarnings("serial") 
public class test extends Canvas { 

private static Random random = new Random(); 

public void paint(Graphics g) { 
    g.drawString("X", random.nextInt(10) * 10, random.nextInt(10) * 10); 

    try { 
     Thread.sleep(250); 
    } catch (Exception e) {} 

    repaint(); 
} 

public static void main(String[] argS) { 
    test canvas = new test(); 
    JFrame frame = new JFrame(); 
    frame.add(canvas); 
    frame.setSize(300, 300); 
    frame.setVisible(true); 
    frame.setLocationRelativeTo(null); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
} 
} 

답변

4

권장 사항 :

  • 는 AWT 구성 요소와 함께 스윙을 혼합하지 마십시오 - 그래서 대신 캔버스 객체의, JPanel과를 사용합니다.
  • JPanel의 paintComponent 메소드를 오버라이드 (override)합니다.
  • super.paintComponent 메소드를 paintComponent의 첫 번째 행으로 호출하십시오.
  • 스윙 타이머를 사용하여 애니메이션을 만들고 결코 paint 또는 paintComponent 메서드에 Thread.sleep을 넣지 마십시오. 실제로 Swing에서 동시성을 처리하는 방법을 모르는 경우 Swing GUI에서 Thread.sleep을 사용하지 않아야합니다.
  • paint 또는 paintComponent 메소드에서 repaint()를 호출하지 마십시오. 페인트 관리자가 호출이 재귀 유도 스택 오버 플로우 오류로 이어지지 않도록 충분히 똑똑하다는 것은 다행입니다.
+0

'다시 그리기() 그림이 실제로 수행되기 전에'항상 즉시 반환 - 그것은이 다시 칠해야합니다 "라고하는 단지 방법입니다 미래의 어느 시점 "이라고 말했습니다. 물론,'paint()'에서 불러내는 것은 실제로 의미가 없습니다. - 그림을 끝내면, 현재 상태는 다시 칠할 필요가 없습니다. –

1

당신이 repaint을 사용하면 AWT 시스템 (배경 색상에 사각형을 그림으로) 그래픽을 취소하고 paint()를 호출하는 캔버스 'update() 메소드를 호출합니다. (이 Canvas 같은 AWT의 중량이 무거운 구성 요소 - 그것은 조금 다른 스윙을 위해.)

그래서, 쉬운 해결 방법이 update를 재정 의하여 받게됩니다 구성 요소 삭제하지 :

public void update(Graphics g) { 
    this.paint(g); 
} 

주 시스템에서 구성 요소가 무효화되어야한다고 결정하면 오래된 페인트 문자열이 사라질 수 있습니다. 다른 창문이 그것을 덮은 후에. 이 관계가없는

:

당신은 (아마도 디버깅을 위해 다른) 그림 방법에 잠을해서는 안됩니다. 페인팅은 이벤트 발송 스레드에서 수행되며 paint 메서드가 완료되지 않으면 이벤트가 전달되지 않습니다. 이러지 마.

대신 별도의 스레드 (또는 주 스레드)가 잠자기 루프를 수행하고 repaint을 호출하십시오.

또한 호버 크래프트 (Hovercraft)가 말했듯이 AWT와 스윙을 혼용하지 마십시오. Canvas을 사용하려면 Swing의 JFrame 대신 AWT Frame을 사용하십시오.

1

이전 위치를 모두 기억하고 인쇄하십시오. 다른 색상으로 인쇄하십시오. 또한 문자를 영원히 인쇄하거나 몇 프레임 만 보이게하려면 말하지 마십시오. 그들이 잠시 후에 사라 지길 원한다면 임의의 위치를 ​​대기열에 넣고 새로운 프레임을 페인트 할 때 대기열의 꼬리 요소를 제거 할 수 있습니다 (이전 위치를 제거하여 채색되지 않도록 할 수 있습니다).

(호버와 파울로에서 권고도 매우 유용합니다.)

관련 문제