2009-11-26 4 views
0

캔버스에 그래프 데이터 구조를 그릴 수있는 Java 애플릿을 만들려고합니다. 노드를 만들려는 노드를 클릭하고 노드를 클릭하여 연결하려고합니다. 문제는 올바르게 작동하는 paint() 메서드를 가져올 수 없습니다. 나는 창 크기를 조정할 때까지Java 2D 그래픽 사각형

Graphics g = this.getGraphics(); 
g.setColor(Color.blue); 
g.fillRect(e.getX(), e.gety(), 40, 40); 

모든 것이 잘 작동, 사용 mousePressed(MouseEvent e) 방법 내부의 새로운 그래프에 노드 (캔버스에 사각형)을 추가 한 다음 모든 채워진 사각형이 사라질. 나는 paint 메소드를 단지 빈 메소드로 오버 라이딩했다. 그러나 같은 일이 여전히 발생한다. 사용자가 마우스를 사용하여 상호 작용할 때까지 어떤 사각형이 있는지 모르기 때문에 paint() 내부에 fillRect 명령을 추가 할 수 없습니다.

마우스 수신기 메서드 내에서 g.fillRect()을 어떻게 사용할 수 있습니까?

답변

6

문제는 그리는 곳이 지속되지 않는다는 것입니다. 어느 순간이든, 당신이 그렸던 모든 것을 잃을 수 있습니다. 이것이 발생하면 paint (Graphics) 메서드가 호출됩니다. 이러한 상황이 발생할 때마다 전체 그림을 다시 칠할 필요가 있거나 필요에 따라 애플릿의 그래픽에 내용을 그리거나 복사하기 위해 캔버스를 따로 보관해야합니다.

여기 만들고 이미지를 그리는 방법은 다음과 같습니다
http://java.sun.com/docs/books/tutorial/2d/images/drawonimage.html

그런 다음, 도장 방법, 당신이 만든 이미지를 표시하기 위해 그래픽 '의 drawImage (...) 메소드를 사용합니다.

+0

이것은 가장 쉬운 방법처럼 보였습니다. 새로운 BufferedImage를 만든 다음 모든 모양을 그린 다음 페인트 메서드로 이미지를 그렸습니다. 감사! – PherricOxide

+1

아무 문제는 없지만, 결국 당신은 완전히 다시 칠해야 할 수도 있지만 결국 Kyl의 조언을 기억하십시오. (또한 업 카드에 투표하고 원하는 답변을 "수락"하는 것을 기억하십시오.) 업보 포인트가 필요합니다. :) – Gunslinger47

+1

이 특별한 경우 데이터를 유지하는 것이 버퍼링 된 이미지보다 훨씬 좋은 아이디어 일 것입니다. 그러나, 양쪽 극단을 얻기위한 +1. –

6

내가 올바르게 읽고 있어요 알고 있지,하지만 왜 단지에 변수에 마지막 클릭의 위치를 ​​저장하지 않습니다 나중에 paint 할 때, paint() 메소드가 호출 될 때?

+0

이것은 올바른 답변입니다. 'mousePressed()'는 자신의 그림을 그리 필요가 없습니다. 그것은 단지'repaint'를 호출하고'paint()'가 그 일을 할 수 있도록 필요한 정보를 저장해야합니다. –

+0

다시 칠할 때 모든 클릭의 위치를 ​​어딘가에 저장하고 해당 목록을 탐색하지 않아도 되겠습니까? paint()는 빈 캔버스에서 시작하여 거기에서부터 시작한다는 것을 이해합니다. – PherricOxide

+1

@PherricOxide : 가능합니다. 그러나 어떤 솔루션을 선택하든 상관없이 그렇게해야합니다. 캔버스가 다시 칠할 필요가 없다고 가정 할 수는 없습니다. – kylc

0

그래픽이 임시입니다. 영역이 더러워지면 다시 칠합니다.

가장 좋은 방법은 BufferedImage를 만들고, mousePressed에서 페인트하고 repaint를 호출하는 것입니다.
페인트가 호출되면 전달 된 Graphics 객체에 이미지를 그립니다. 이렇게하면 Rectangles를 저장할 필요가 없으며 성능을 향상시키는 버퍼가 생깁니다.

관련 문제