2011-11-10 2 views
0
import java.awt.*; 
import javax.swing.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import javax.swing.event.*; 
import java.awt.geom.*; 
import java.util.*; 

public class test extends JFrame implements ActionListener, MouseListener { 

    private Vector<String> vlist = new Vector<String>(); 
    private int mouseX, mouseY; 
    Canvas c = new Canvas(); 

    public test() { 
     setSize(400,400); 
     addMouseListener(this); 

    } 

    public static void main(String[] args) { 


     java.awt.EventQueue.invokeLater(new Runnable() { 
       public void run() { 
        test frame = new test(); 
        //frame.setBackground(Color.yellow); 
        frame.setVisible(true); 
       } 
     }); 
    } 

    public void actionPerformed(ActionEvent ae) { 

    } 

    @Override 
    public void paint(Graphics g) { 

     Shape circle = new Ellipse2D.Float(100f, 100f, 100f, 100f); 
     Graphics2D ga = (Graphics2D)g; 
     ga.draw(circle); 

    } 

    public void move() { 

    } 

    public void drawCircle(int x, int y) { 

    } 

    public void mouseClicked(MouseEvent e) { 
     repaint(); 

    } 

    public void mouseExited(MouseEvent e) { 

    } 

    public void mousePressed(MouseEvent e) { 
     this.mouseX=e.getX(); 
     this.mouseY=e.getY(); 
    } 

    public void mouseReleased(MouseEvent e) { 

    } 

    public void mouseEntered(MouseEvent e) { 

    } 
} 

자바에서 그래픽 프로그래밍을 배우기위한 테스트 프로그램을 작성하고 싶습니다. 위의 코드를 실행하려면 원이 자동으로 그려집니다. paint() 메서드가 자동 실행되는 이유는 무엇입니까? 나는 마우스를 클릭했을 때 만들어 질 원이다.자바 페인트() 자동 실행?

+1

1) Swing 구성 요소 (예 :'JFrame')와 AWT (예 :'Canvas')를 함께 사용하지 마십시오. 2)'setSize (400,400);'사용자 정의 렌더링 컴포넌트의 참조 된 크기를 설정하고 프레임에'.so'가 호출 된 후에'pack() '을 호출합니다. 3) 동기화가 필요하지 않으면'Vector'보다는'ArrayList'를 사용하십시오. –

답변

1

클래스에 속성을 추가하십시오. draw가 true 인 경우에만

boolean draw; 

서라운드

if (draw) { 
    // existing code 
} 

이 프로그램을 만들 것입니다 함께 paint(...)의 코드는립니다. 처음에는 거짓이므로 아무것도 그려지지 않습니다. 마우스를 클릭하면 값 속성 draw은 이됩니다.

public void mouseClicked(MouseEvent e) { 
    draw = true; 
    repaint(); 
} 
+0

대단합니다! 감사 – hkguile

1

스윙 페인트 관리자는 JFrame이 렌더링 될 때 paint 메서드를 호출합니다. 이에 대한 자세한 내용은 Painting in AWT and Swing을 참조하십시오.

  • 가 JPanel의 또는 JComponent의 상속 다른 구성 요소 A의 드로잉 작업을 수행하는 당신이 원하는 것, 당신의 프로그램을 개선합니다.
  • paint 메서드가 아닌 JPanel의 paintComponent 메서드에서 실제 그림을 그립니다.
  • 먼저 super.paintComponent() 메서드를 호출하십시오.
  • 마우스 클릭시 원을 그리려면 paintComponent 메소드에 if 블록을 추가하여 일부 부울 필드 부울이 true 인 경우에만 원을 그립니다. 그런 다음 MouseListener에서 true로 설정 한 다음 repaint를 호출합니다.
  • 가장 중요한 것은 스윙 그래픽을 사용하는 방법에 대한 자습서를 읽는 것이 다소 반 직관적입니다 (이 스레드에서 Tom의 답변에 의해 입증 됨).
0

사용자 정의 페인팅을 수행하려면 JFrame의 paint() 메소드를 재정의해서는 안됩니다.

JPanel 또는 JComponent의 paintComponent() 메서드를 재정의하고 해당 구성 요소를 JFrame에 추가해야합니다.

기본 사항은 Custom Painting의 스윙 튜리아를 확인하십시오.

자세한 내용은 Painting in AWT and Swing을 확인하십시오.