2013-01-12 3 views
1

나는 mousebutton의 릴리스에 약간의 픽셀을 이동하도록되어이 코드 조각이 : 디버거의Java 6 : 행을 드래그/이동하는 방법?

if (selected != -1) { 
    Point to = e.getPoint(); 
    int dx = start.x - to.x; 
    int dy = start.y - to.y; 
    for (Point p: store.get(selected)) { 
     int px = (int) p.getX(); 
     int py = (int) p.getY(); 
     p.move(px - dx, py - dy); 
    } 

    validate(); 

사용이 그 점 P의 참 얻을 새 값을 보여줍니다하지만 영상은 업데이트되지 않습니다. 제발 도와주세요.

다음은 내 프로그램의 전체 코드입니다.

public class Pisi extends JFrame implements MouseMotionListener, MouseListener { 
ArrayList<ArrayList<Point>> store = new ArrayList<ArrayList<Point>>(); 
ArrayList<Point> pts = new ArrayList<Point>(); 
Point start; 
static int xsize = 450; 
static int ysize = 300; 
int listNumber = 0; 
int selected = -1; 



public static void main(String[] args) { 
    Pisi d = new Pisi(); 
    d.setSize(xsize, ysize); 
    d.setLocationRelativeTo(null); 
    d.addMouseMotionListener(d); 
    d.addMouseListener(d); 
    d.setResizable(false); 
    d.setVisible(true); 
} 

@Override 
public void update(Graphics g) { 
    paint(g); 
} 
@Override 
public void paint(Graphics g) { 
    Point last = null; 

    for (Point p : pts) { 

     if (last == null) { 
      last = p; 
      continue; 
     } 
     g.drawLine(last.x, last.y, p.x, p.y); 
     last = p; 
    } 
} 

@Override 
public void mouseDragged(MouseEvent e) { 

    if (e.getButton() == MouseEvent.BUTTON1) { 
     pts.add(e.getPoint()); 
     repaint(); 
    } 

} 

@Override 
public void mouseMoved(MouseEvent e) { 
    //To change body of implemented methods use File | Settings | File Templates. 
} 

@Override 
public void mouseClicked(MouseEvent e) { 
    //To change body of implemented methods use File | Settings | File Templates. 
} 

@Override 
public void mousePressed(MouseEvent e) { 
    Point point = e.getPoint(); 
    start = null; 
    selected = -1; 
    for (ArrayList<Point> points: store) { 
     for (Point p : points) { 
      double dist = point.distanceSq(p); 
      if (dist < 10) { 
       selected = store.indexOf(points); 
      } 
     } 
    } 
    if (selected != -1) { 
     start = e.getPoint(); 
    } 
    System.out.println(selected); 
} 


@Override 
public void mouseReleased(MouseEvent e) { 
    if (selected != -1) { 
     Point to = e.getPoint(); 
     int dx = start.x - to.x; 
     int dy = start.y - to.y; 
     for (Point p: store.get(selected)) { 
      int px = (int) p.getX(); 
      int py = (int) p.getY(); 
      p.move(px - dx, py - dy); 
     } 

     validate(); 
    } else if (e.getButton() == MouseEvent.BUTTON1 && pts.size() != 0) { 
     store.add(new ArrayList<Point>(listNumber)); 
     for (int i = 0; i < pts.size(); i++) { 
      store.get(listNumber).add(pts.get(i)); 
     } 
     listNumber++; 
    } 
    pts.clear(); 

} 

@Override 
public void mouseEntered(MouseEvent e) { 
    //To change body of implemented methods use File | Settings | File Templates. 
} 

@Override 
public void mouseExited(MouseEvent mouseEvent) { 
    //To change body of implemented methods use File | Settings | File Templates. 
} 
} 
+0

처음부터 JFrame에서 직접 그리지 않아야합니다. 아직 Swing 그래픽 튜토리얼을 들었습니까? 그렇지 않다면 그렇게하는 것이 좋습니다. –

답변

4

내가 추천 할 것입니다 : 당신이하지 직접 JFrame의의 paint(...) 방법, JPanel과의 paintComponent(...) 방법 그려

  • 먼저. 이렇게하면 Swing의 자동 더블 버퍼링에 액세스 할 수있게되고 JFrame의 모든 하위 또는 경계선의 그래픽을 엉망으로 만들지 않게됩니다.
  • 대신 ArrayList<Point>ArrayList<ArrayList<Point>>을 사용하는 대신 Path2D와 ArrayList<Path2D>을 사용하십시오.
  • `paintComponent의 Graphics 객체를 Graphics2D 객체에 캐스트 한 것
  • 이 Graphics2D 객체를 사용하여 draw(Shape s) 메서드를 사용하여 Path2D 객체를 그립니다. 마우스 언론에 의해 개최되는 클래스 Path2D 객체에 발생하는 경우에 당신이 볼 수있는 클래스 Path2D contains(...) 방법을 사용
  • 당신의 List<Path2D>
  • 클래스 Path2D를 선택하면 당신이 AffineTransform를 사용해 변환 방법을 통해 그것을 이동하는 것이.

편집 : 마우스가 클래스 Path2D에 의해 설명 된 오목 지역에서 누르면 이것이 사실이기 때문에
아니, contains(...)이 작동하지 않습니다. 이 더 ...

편집 2로 상대 :이 약
한 가지 방법은 mousePress이 클래스 Path2D를 구성하는 선분의 ​​근처에 있는지 확인하기 위해 클래스 Path2D 년대를 통해 반복에 사용하는 PathIterator를 사용하는 것입니다.

+0

견고한 답변을 보내 주셔서 감사합니다. –

+0

@PriiduKull : 환영합니다! –

0

내가합니다 (Container 클래스의 방법) 첫째 validate() 방법을 시도 할 것을 권장

참고 : validate() 방법을 사용하려고 작동하지 않습니다information on validate() method

경우 :

update() thod (paint() 메서드 호출) 또는 repaint() 메서드입니다.

+0

'validate()'는 화면에 그림을 그리기위한 것이 아니라 구성 요소의 레이아웃을 업데이트하기위한 것이므로 여기서는 레이아웃이 중요하지 않으므로 작동하지 않을 것입니다. Swing 응용 프로그램 (''Swing'' 응용 프로그램)의 경우'update()'는 거의 호출되어서는 안됩니다. –

+0

@HovercraftFullOfEels 메모 주셔서 감사합니다.어떤 방법을 사용해야합니까 –

+0

나는 그것을 조사하고있다. 그는 자신의 코드에 몇 가지 문제가 있습니다. –