2012-03-14 2 views
2

내 응용 프로그램에 시작 위치에서 마우스를 클릭하고 끝 위치에서 마우스를 놓아 직선을 그릴 수있는 기능을 추가하고 싶습니다. 최종적으로 마우스를 놓을 때까지 마우스를 움직이면 선이 움직여야합니다. Microsoft Paint 응용 프로그램을 사용하여 선을 그리는 방법과 비슷합니다.마우스가 움직일 때 자바 그리기 선

어떻게하면 사각형 영역에 이미 그려져있는 다른 것들도 다시 그리지 않고 선이 다시 그려 지도록이 코드를 구현할 수 있습니까?

+1

당신이 스윙 구성 요소를 사용할 수 있습니다 .. 라인을 이동? 그렇다면 다시 칠하는 것에 대해 걱정하지 말고 프레임 워크가 처리하도록하십시오. paintComponent 메소드를 오버라이드 (override) 해, 선을 묘화합니다. 그런 다음 마우스 수신기, 시작된 작업으로 시작점과 끝점을 설정하는 방법을 알아낼 수 있습니다. – davidfrancis

답변

2

MouseListener 인터페이스는 이것에 대한 친구입니다. mousePressed 및 mouseReleased 함수를 구현할 수 있습니다. 의 MouseListener 인터페이스를 사용하면 함께 놀러 수있는 다음과 같은 방법이 있습니다

public void mouseEntered(MouseEvent mouse){ } 
public void mouseExited(MouseEvent mouse){ } 
public void mousePressed(MouseEvent mouse){ } 
public void mouseReleased(MouseEvent mouse){ } 
12

마우스가 이동할 때 화면에 빨간색 선을 그립니다 ...이 시도를 (드래그). 마우스를 이동할 때

public static void main(String args[]) throws Exception { 
    JFrame f = new JFrame("Draw a Red Line"); 
    f.setSize(300, 300); 
    f.setLocation(300, 300); 
    f.setResizable(false); 
    JPanel p = new JPanel() { 
     Point pointStart = null; 
     Point pointEnd = null; 
     { 
      addMouseListener(new MouseAdapter() { 
       public void mousePressed(MouseEvent e) { 
        pointStart = e.getPoint(); 
       } 

       public void mouseReleased(MouseEvent e) { 
        pointStart = null; 
       } 
      }); 
      addMouseMotionListener(new MouseMotionAdapter() { 
       public void mouseMoved(MouseEvent e) { 
        pointEnd = e.getPoint(); 
       } 

       public void mouseDragged(MouseEvent e) { 
        pointEnd = e.getPoint(); 
        repaint(); 
       } 
      }); 
     } 
     public void paint(Graphics g) { 
      super.paint(g); 
      if (pointStart != null) { 
       g.setColor(Color.RED); 
       g.drawLine(pointStart.x, pointStart.y, pointEnd.x, pointEnd.y); 
      } 
     } 
    }; 
    f.add(p); 
    f.setVisible(true); 
} 
+0

어떻게 픽셀을 저장합니까? – trs

+0

실제로 @davidfrancis에 의하면, 마우스가 내려 갔을 때 라인을 그려서 일반 스윙이 다시 칠하게합니다. 나는 당신을 위해 작동 샘플을 첨부 할 것입니다. – Java42

+0

좋아, 나는 당신을 위해 작업 예제로 업데이 트했습니다. 엔조이 ... – Java42

1
JFrame frame = new JFrame("Lines"); 

    frame.add(new JComponent() { 
     private Shape line = null; 
     { 
      line = new Line2D.Double(100, 100, 200, 200); 
      prevPoint = new Point(); 
      newPoint = new Point(); 

      MouseAdapter mouseAdapter = new MouseAdapter() { 
       @Override 
       public void mousePressed(MouseEvent e) { 
        prevPoint = e.getPoint(); 
        System.out.println("Prev Point=" + prevPoint.toString()); 
        repaint(); 
       } 

       @Override 
       public void mouseDragged(MouseEvent e) { 
        int dx = 0; 
        int dy = 0; 

        dx = (int) (prevPoint.x - e.getPoint().getX()); 
        dy = (int) (prevPoint.y - e.getPoint().getY()); 

        Line2D shape = (Line2D) line; 

        int x1 = (int) (shape.getX1() - dx); 
        int y1 = (int) (shape.getY1() - dy); 

        int x2 = (int) (shape.getX2() - dx); 
        int y2 = (int) (shape.getY2() - dy); 

        Point startPoint = new Point(x1, y1); 
        Point endPoint = new Point(x2, y2); 

        if (shape != null) { 
         shape.setLine(startPoint, endPoint); 
         prevPoint = e.getPoint(); 
         repaint(); 
        } 
       } 

       @Override 
       public void mouseReleased(MouseEvent e) { 
        repaint(); 
       } 

      }; 
      addMouseListener(mouseAdapter); 
      addMouseMotionListener(mouseAdapter); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      Graphics2D g2d = (Graphics2D) g; 
      g2d.setPaint(Color.BLUE); 
      g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
        RenderingHints.VALUE_ANTIALIAS_ON); 
      if (line != null) { 
       g2d.draw(line); 
      } 
     } 
    }); 
    frame.setSize(650, 400); 
    frame.setLocationRelativeTo(null); 
    frame.setVisible(true); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

이이 도움이 희망 ..