2012-04-18 4 views
2

마우스를 끌 때 JPanel에 2 줄 (그 이상)을 그립니다. 난 내 코드에서 super.paintComponent(g) 을 사용하면 내가 super.paintComponent(g)를 사용하지 않는 그러나 때, 나는 패널에 2 선을 그릴 수없는, 결과는 아래의 그림처럼 추한 :마우스를 끌 때 Jpanel에 선을 그립니다.

enter image description here

I 선이 왜 그렇게 행동했는지 이해하십시오.

마우스를 끌 때 Jpanel에 선을 그릴 수있는 방법은 무엇입니까? BTW, g2d.draw(line2d)에 의해 그려진 선은 때로는 부드러운 라인이 아니다 (아래 그림)

enter image description here

내 코드는 지금까지 :

import java.awt.*; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseMotionListener; 
import java.awt.geom.Line2D; 
import java.util.ArrayList; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.WindowConstants; 


public class LineDrawing extends JPanel implements MouseMotionListener, MouseListener{ 
    Point point1; 
    Point point2; 
    Line2D line2d; 

    public LineDrawing(){ 
     super(); 
     addMouseListener(this); 
     addMouseMotionListener(this); 
    } 

@Override 
    public void paintComponent(Graphics g){ 

    //super.paintComponent(g); 

     Graphics2D g2d = (Graphics2D) g; 
     if(point1!=null && point2!=null){ 

      g2d.setPaint(Color.RED); 
      g2d.setStroke(new BasicStroke(1.5f)); 
      g2d.draw(line2d); 

     } 
     } 


    @Override 
    public void mouseDragged(MouseEvent e) { 

    point2 = e.getPoint(); 
    line2d = new Line2D.Double(point1, point2); 
    repaint(); 

    } 

    @Override 
    public void mouseMoved(MouseEvent e) { 

    } 

    @Override 
    public void mouseClicked(MouseEvent e) { 

    } 

    @Override 
    public void mousePressed(MouseEvent e) { 
    point1 = e.getPoint(); 

    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 

    } 

@Override 
public void mouseEntered(MouseEvent e) { 

} 

@Override 
public void mouseExited(MouseEvent e) { 

} 


public static void main(String a[]){ 
    EventQueue.invokeLater(new Runnable(){ 
     @Override 
     public void run() { 

     JFrame frame = new JFrame(); 
     LineDrawing linedraw= new LineDrawing(); 
     frame.add(linedraw); 
     frame.setSize(500,500); 
     frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     frame.setVisible(true); 

         } 
       }); 
    } 

}

답변

4

..draw 2 라인

이 질문에서 문제의 핵심처럼 보입니다.

클릭/끌기 할 때 확장형 목록 (예 : ArrayList)에 줄 모음을 유지하고 목록에 줄 바꿈을 추가 한 다음 repaint()으로 전화하십시오. paintComponent(Graphics)에서 컬렉션을 반복하고 각 줄을 그립니다.

BTW - 이것을 테스트하는 동안 사용자가 창을 최소화하고 복원하지 않았다고 추측합니다. 당신의 선들 (아름답거나 추악한)은 사라질 것입니다!


..they은 사라졌다. 이유가 뭐야?

paint()paintComponent()은 GUI를 다시 그리기해야 할 때마다 호출됩니다. 앱 앞에 다른 창이 나타나면 호출 될 수 있습니다. 그런 다음 다시 앞으로 가져옵니다. 또 다른 시간은 최소화 된 상태에서 복원 된 후입니다. 라인 (들)의

  • 저장 위치를하고 (전술 한 바와 같이) 요청 때마다 그들 모두를 다시 그리기 : 선을 유지하기

    옵션은 다음과 같습니다. 이것은 대부분의 목적을 위해 작동 할 수 있습니다. 수백 줄이 있더라도 GUI는 '눈 깜짝 할 사이에'다시 그릴 것입니다.

  • 각 줄을 BufferedImage에 그려 넣고 이미지를 JLabel (ImageIcon)에 넣습니다. 이 방법은 도면 영역이 고정 된 크기 인 경우에 효과적입니다. & 아무 것도 제거되지 않고 선, 호, 반투명 영역, 작은 이미지, 텍스트 등을 수용 할 수 있습니다. 이미지를 렌더링 표면으로 사용하면 ArrayList이 더 이상 필요하지 않습니다. 왜냐하면 이미지에 새 줄을 추가하고 레이블을 다시 채워서 새 줄과 모든 이전 줄을 보는 것뿐입니다.

용맹 한 선은 직선이 아니다.

왜냐하면 선을 그릴 때 '렌더링 힌트'가 사용 되었기 때문입니다. 정렬 된 픽셀 행으로 구성된 화면은 수직 또는 수평선 만 완벽하게 만들 수 있습니다. 직각의 '환상'을 다른 각도로 줄이려면 dithering이라는 기술이 필요합니다. RenderingHints에 대한 자세한 설명과 설명을 보려면 Graphics2D의 시작 부분을 읽으십시오.

+0

맞아, 사라졌습니다. 이유가 뭐야? –

+0

감사합니다. BTW, paintComponent에 의해 그려진 선 - 가끔은 부드러운 선이 아닙니다. 그걸 어떻게 없앨 수 있니? –

+0

나는 질문을 편집 했으므로 그림에서 볼 수있다. 선은 직선이 아니다. 나는 모든 라인이 아니라 일부 라인을 의미합니다. –

1

나는 당신의 질문을 얻지 만, 당신이 연속적인 선을 그려보고 싶다면. 드래그 할 때 마지막 점포 위치를 업데이트해야합니다.

@Override 
    public void mouseDragged(MouseEvent e) { 
    point2 = e.getPoint(); 
    line2d = new Line2D.Double(point1, point2); 
    point1 = point2; // add this line 
    repaint(); 
    } 
+0

나는 연속 선을 그리고 싶지 않다, 나는 sepearate 선을 원한다.. –

관련 문제