2013-06-28 2 views
4

그래서 응용 프로그램을 만들고 화면에 추가 된 모양을 추적하고 싶습니다. 지금까지 다음 코드를 가지고 있지만 원이 추가되면 이동/변경할 수 없습니다. 이상적으로는 Shift-click과 같은 것을 사용하여 주위를 이동하거나 강조 표시 할 수 있습니다.자바 그래픽 - 모양 추적

나는 한 원에서 다른 원으로 선을 끌 수 있도록 어떻게 만들 수 있는지 궁금합니다. 나는 여기에 일을 위해 잘못된 도구를 사용하고 있는지 모르지만 어떤 도움을 주시면 감사하겠습니다.

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

public class MappingApp extends JFrame implements MouseListener { 

    private int x=50; // leftmost pixel in circle has this x-coordinate 
    private int y=50; // topmost pixel in circle has this y-coordinate 

    public MappingApp() { 
    setSize(800,800); 
    setLocation(100,100); 
    addMouseListener(this); 
    setVisible(true); 
    } 

    // paint is called automatically when program begins, when window is 
    // refreshed and when repaint() is invoked 
    public void paint(Graphics g) { 
    g.setColor(Color.yellow); 
    g.fillOval(x,y,100,100); 

} 

    // The next 4 methods must be defined, but you won't use them. 
    public void mouseReleased(MouseEvent e) { } 
    public void mouseEntered(MouseEvent e) { } 
    public void mouseExited(MouseEvent e) { } 
    public void mousePressed(MouseEvent e) { } 

    public void mouseClicked(MouseEvent e) { 
    x = e.getX(); // x-coordinate of the mouse click 
    y = e.getY(); // y-coordinate of the mouse click 
    repaint(); //calls paint() 
    } 

    public static void main(String argv[]) { 
    DrawCircle c = new DrawCircle(); 
    } 
} 

답변

5

셰이프를 만들고이를 사용하여 필드를 참조한 다음 그래픽 개체를 사용하여 셰이프를 그릴 수 있습니다. 예를 들어 대한

: 당신이는, super.paint (g)를 호출 고려해야한다, 그래서 당신은 JFrame의를 확장하고

Ellipse2D.Float ellipse=new Ellipse2D.Float(50,50,100,100); 

graphics.draw(ellipse); 
+0

graphics.draw (타원); 나에게 오류를 준다 ... – Tim

+0

그래픽은 pseudo이다. 나는 당신이 사용하고있는 그래픽 객체를 언급하고있다. 가지고있는 예제는 'g'를 참조로 사용합니다. 셰이프로 페인팅하려면 g.draw() – Nikki

+0

+1을 사용해보세요. 그러나 Graphics 클래스는 도형을 그리는 방법을 알지 못합니다. 'Graphics2D' 클래스를 사용할 필요가 있습니다. 또한'fill()'메소드를 사용해야한다. draw() 메서드는 Shape의 외곽선을 그립니다. 자세한 내용은 [모양으로 재생] (http://tips4java.wordpress.com/2013/05/13/playing-with-shapes/)을 참조하십시오. – camickr

0

을; 재정의 된 페인트 방법의 시작 부분에서

+1

OP는'JFrame'의'paint'를 덮어 쓰지 않아야합니다 .. –

4

1) 그려진 개체 클릭/선택에 대한 답변은 this이고, 프레스를 통한 줄 작성 및 마우스 끌기에 대해서는 here을 참조하십시오.

2) JFramepaint(..)을 재정의하지 말아야합니다.

오히려 JFrameJPanel를 추가하고 JPanelpaintComponent(Graphics g)가 오버라이드 (override) 방법 첫 번째 통화로 super.paintComponent(g); 전화를 잊고하지 오버라이드 (override) : 당신이 할 경우,

또한 :

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

    g.setColor(Color.yellow); 
    g.fillOval(x,y,100,100); 

} 

으로 paintComponent(Graphics g) 당 문서 당신은 반드시이 컴포넌트가 불투명 한 경우, 불투명 한 속성 인 을 기꺼이 받아 들여야한다. comp 배경을 불투명하지 않은 색으로 채 웁니다. 불투명 한 속성을 존중하지 않으면 시각적 인 유물을 볼 수 있습니다.

3) JFrame 사용에 setSize 전화 그나마 올바른 LayoutManager 및/또는 오버라이드 (override) getPreferredSize (이 보이지 설정하기 전에 JFramepack() 전화보다 그래서 우리의 그래픽 내용에 맞게)과 수 JPanel에 그릴 때 일반적으로 수행.

4) Concurrecny in Swing 특히 Event-Dispatch-Thread을 읽으십시오.

+3

방금 ​​20K를 통과 한 것으로 나타났습니다! 축하드립니다. :) –

+2

+1 hehe 감사합니다. 나는 내가 스윙에 대해 조금 알고 있다고 말할 수있을 것 같은 기분입니다! :) –