2012-12-19 2 views
4

모양 작업의 크기 조정을 완료하려고합니다. 원하는 결과를 거의 얻었습니다. 마우스를 크기 조정 커서로 변경 한 후에 드래그하면 같은 유형의 다른 모양이 먼저 그려지고 두 번째 그림 모양이 크기 조정됩니다. . 이러한 그림의 결과 : 이것은 내 관련 코드가크기 조정 모양이 거의 작동합니다.

enter image description here

: 무슨 일 수도

@Override 
public void mouseMoved(MouseEvent e) { 

    if (e.isControlDown()) { 
     updateShapeUnderMouse(e.getX(), e.getY()); 
    } // deals with drawing shape if control button held 

    //deals with identifying shape to resize 
     int x = e.getX(); 
     int y = e.getY(); 

    for (int i = myShapes.size() - 1; i >= 0; i--) { 
     Shape s = (Shape) myShapes.get(i); 
      if (s.isedgePoint(x, y)) { 
      ShapetoResize = s; 
      setCursor(crnw); 
      prevDragX = x; 
      prevDragY = y; 
      return; 
     } 
    } 

@Override 
public void mouseDragged(MouseEvent event) { 

     if (event.isControlDown()) { 
      if (shapeUnderMouse != null) { 
      shapeUnderMouse.setXPos(event.getX()); 
      shapeUnderMouse.setYPos(event.getY()); 
      repaint(); 
     } 
    } // deals with moving the shape 

    //deals with identifying and resizing shape 
    int x = event.getX(); 
    int y = event.getY(); 

    if (ShapetoResize != null) { 
     if (ShapetoResize instanceof Square) { 
      ShapetoResize.resizeSE(x - prevDragX, y - prevDragY); 
     } else if (ShapetoResize instanceof Rectangle) { // SAME CODE FOR EACH SHAPE 
    } 

    repaint(); 
    } 
} 

어떤 생각?

public ArrayList<Shape> myShapes = new ArrayList(); 


@Override 
public void paintComponent(Graphics g) { 

    super.paintComponent(g); 
    int length = myShapes.size(); 

    for (int i = 0; i < length; i++) { 

     myShapes.get(i).paint(g); 
    } 

} 
+3

이미지에 대한 링크를 추가하면 이미지를 게시 할 담당자가 부족할 수 있지만 대신 할 수 있습니다. –

+0

그걸 볼 수 있니? – GCnewbie

+1

질문을 편집하여 설명하는 문제가있는 [sscce] (http://sscce.org/)를 포함하십시오. 대칭 크기 조정의 경우 'MouseWheelListener'를 고려하십시오. – trashgod

답변

1

모양을 추가하는 논리는 무엇입니까? 드로잉 캔버스를 왼쪽 클릭하여 모양이 추가 되었습니까? 그렇다면 문제는 클릭 한 번에 도형이 추가되고 크기가 조정되는 것입니다. 객체를 드래그 한 후 실행을 중단하여 디버깅 할 수 있습니다. 목록에 하나 대신 두 개의 모양이 포함됩니다.

+0

좋아, 잠시 후 알겠습니다. 컨트롤 버튼을 누르고있는 동안 셰이프를 이동 한 후 첫 번째 if 문에 포함 된 첫 번째 다시 페인트로 두 개를 수행했습니다. 그런 다음 코드의 다른 부분은 모양의 크기 조정을 처리하므로 두 번째 다시 칠함 – GCnewbie

+2

숙제에 태그를 붙이려고 시도했지만 그대로 사용하지 않도록 지정했습니다. 폐기 됨 – GCnewbie

+0

맞았습니다! 마우스 모양의 메서드에서 캔버스에 셰이프를 추가하는 코드를 mouseClicked (getClick == 1) 메서드에 추가하여 해결했습니다. 크기 조정 프로세스의 끌기가 시작되기 전에 마우스를 누른 이후로 다른 셰이프를 그리는 중이었습니다. 고맙습니다 :)! SSCCE를 게시하지 않은 것에 대해 사과드립니다. 2 일 전에도이 문서를 읽었지만 충분히 전재하지는 않았습니다. – GCnewbie

3

코드의이 부분을 보지 않고 그냥 추측이지만 나는 ShapetoResize.resizeSE(int x, int y); 메서드에서 새로운 모양을 만들어서 두 가지 모양을 생성한다고 생각합니다.

나는 resizeSERectangle 또는 Shape (모양이 내장 된 두 개의 인터페이스)에 없기 때문에 자신의 방법이라고 가정합니다. 물론 Shape 인터페이스에는 paint 메서드가 없으므로이 셰이프 인터페이스에 대한 코드를 제공하지 않았으므로 혼동을 줄 수있는 사용자 지정 인터페이스를 사용하고있을 가능성이 큽니다. 이러한 방법에 대한 코드를 게시하면 확인할 수 있습니다.

다음은 코드를 작동 방식 (및 SSCCE)으로 모으는 예제입니다. 나는 이것들을 직사각형에만 제한하고 (그들은 단지 Shape에 내장되어 있기 때문에) 크기를 조절하는 것과 관련이없는 많은 것들을 제거했다. 그래도 문제가 해결되지 않으면 다음 예제를 사용하여 문제를 재현 해보십시오.

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

public class ShapeResizer extends Box{ 
    Dimension preferredSize = new Dimension(400,300); 
    public ArrayList<Shape> myShapes = new ArrayList(); 
    //Shape that's targeted for editing 
    Shape currentShape; 

    public ShapeResizer(){ 
     super(BoxLayout.X_AXIS); 

     //Shapes (because I don't want to make write code for the user to make shapes) 
     myShapes.add(new Rectangle(100, 100, 20, 20)); 
     myShapes.add(new Rectangle(200, 200, 30, 30)); 

     addMouseMotionListener(new MouseMotionListener() { 
      @Override 
      public void mouseMoved(MouseEvent e) { 

       //deals with identifying shape to resize 
       int x = e.getX(); 
       int y = e.getY(); 

       boolean foundShape = false; 
       for (int i = myShapes.size() - 1; i >= 0; i--) { 
        Shape s = (Shape) myShapes.get(i); 
        if (s.contains(e.getPoint())) { 
         //We found a shape to target 
         currentShape = s; 
         foundShape = true; 
        } 
       } 

       if(!foundShape){ 
        //Reset the shape and cursor only if needed 
        if(currentShape != null){ 
         currentShape = null; 
         setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); 
        } 
       } else { 
        setCursor(Cursor.getPredefinedCursor(Cursor.SE_RESIZE_CURSOR)); 
       } 

      } 

      @Override 
      public void mouseDragged(MouseEvent event) { 
       if (currentShape != null) { 
        resizeShape(currentShape, event.getPoint()); 
       } 
       repaint(); 
      } 
     }); 
    } 

    public void resizeShape(Shape s, Point p){ 
     if(s instanceof Rectangle){ 
      Rectangle r = (Rectangle)s; 
      r.setSize(p.x - r.x, p.y - r.y); 
     } 
    } 

    public void drawShape(Graphics g, Shape s){ 
     if(s instanceof Rectangle){ 
      Rectangle r = (Rectangle)s; 
      g.drawRect(r.x, r.y, r.width, r.height); 
     } 
    } 

    @Override 
    public void paintComponent(Graphics g) { 

     super.paintComponent(g); 
     int length = myShapes.size(); 

     for (int i = 0; i < length; i++) { 
      drawShape(g, myShapes.get(i)); 
     } 

    } 

    public Dimension getPreferredSize(){ 
     return preferredSize; 
    } 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setContentPane(new ShapeResizer()); 
     frame.validate(); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
}