2013-05-08 4 views
2

JButton의 Action Listener를 사용하여 다른 모양을 그리는 중입니다. 이전에 그려진 도형을 항상 패널에 유지하려면 모든 그리기 된 모양이 추가되고 전체 목록을 다시 칠하는 arraylist를 사용했습니다. 어떻게하면됩니까? 언제나 다른 것들이 Jpanel에 표시되는 동안 어떤 모양을 드래그합니까?Jpanel에서 도형 드래그

protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 


     System.out.println("====>>> " + s); 
     switch (s) { 

      case "Button1": 
       Activity act = new Activity(); 
       act.setArcH(15); 
       act.setArcW(15); 
       act.setBreadth(40); 
       act.setLength(50); 
       act.setXpoint(x); 
       act.setYpoint(y); 

       //========================================================== 

       obj = new ShapePoints(); 
       obj.setShapeId(ShapesID.ROUND_RECTANGLE_ID); 
       obj.setxPoint(act.getXpoint()); 
       obj.setyPoint(act.getYpoint()); 
       obj.setLength(act.getLength()); 
       obj.setBreadth(act.getBreadth()); 
       obj.setArcW(act.getArcW()); 
       obj.setArcH(act.getArcH()); 
       shapePoints.add(obj); 

       Iterator itr = shapePoints.iterator(); 
       while (itr.hasNext()) { 
        ShapePoints sp = (ShapePoints) itr.next(); 

        switch (sp.getShapeId()) { 

         case ShapesID.ARROW_ID: 

          break; 
         case ShapesID.CIRCLE_ID: 

          g.drawOval(obj.getxPoint(), obj.getyPoint(), obj.getLength(), obj.getBreadth()); 

          break; 


         case ShapesID.CON_CIRCLE_ID: 
          g.drawOval(sp.getxPoint(), sp.getyPoint(), sp.getLength(), sp.getLength()); 
          g.fillOval(sp.getxPoint() + 10, sp.getyPoint() + 10, sp.getBreadth()/2, sp.getBreadth()/2); 
          break; 
         case ShapesID.RECTANGLE_ID: 

          break; 
         case ShapesID.ROUND_RECTANGLE_ID: 

          g.drawRoundRect(obj.getxPoint(), obj.getyPoint(), obj.getLength(), obj.getBreadth(), 
            obj.getArcW(), obj.getArcH()); 
          break; 
        } 
       } 
       break; 

이 1 개 버튼 당신은의 MouseListener와 모든 MouseMotionListener를 추가 할 필요가

답변

4

에 대한 (보통은 모두 단일 인스턴스을)하고 모양 마우스를 누르면 이벤트를 포함 여부 처리 여부를 확인합니다. 예인 경우 마우스를 드래그하여 모양을 변환하는 위치를 추적하고 평소와 같이 repaint()을 계속 호출합니다.

  • 싱글 클릭은 (는 적어도 3 정점이있는 경우)
  • 더블 클릭이 현재 그려 다각형을 생성하는 다각형의 정점을 만들고 우리는 새로운
  • 을 마우스 오른쪽 버튼으로 클릭하여 현재 그려 다각형을 지 웁니다 작성 하고 새
  • /를 눌러 드래그/릴리스 마우스 아래에있는 다각형을 이동 생성 (몇 가지가있는 경우, 그것은 발견 된 첫 번째 일이 걸립니다. 아마 더 나은 루프 역 할 것이다)

여기 있습니다. 예 :

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.Point; 
import java.awt.Polygon; 
import java.awt.event.MouseAdapter; 
import java.awt.geom.Rectangle2D; 
import java.util.ArrayList; 
import java.util.List; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class TestNaming { 

    private static final int PANEL_WIDTH = 600; 
    private static final int PANEL_HEIGHT = 600; 

    public static class Drawing extends JPanel { 

     private static final Font FONT = new Font("Arial", Font.PLAIN, 12); 

     private List<Polygon> polygons = new ArrayList<Polygon>(); 

     private Polygon currentPolygon = new Polygon(); 

     private MouseAdapter mouseListener = new MouseAdapter() { 

      private Polygon dragged; 
      private Point lastLocation; 

      @Override 
      public void mousePressed(java.awt.event.MouseEvent e) { 
       for (Polygon p : polygons) { 
        if (p.contains(e.getPoint())) { 
         dragged = p; 
         lastLocation = e.getPoint(); 
         break; 
        } 
       } 
      } 

      @Override 
      public void mouseDragged(java.awt.event.MouseEvent e) { 
       if (dragged != null) { 
        dragged.translate(e.getX() - lastLocation.x, e.getY() - lastLocation.y); 
        lastLocation = e.getPoint(); 
        repaint(); 
       } 
      } 

      @Override 
      public void mouseReleased(java.awt.event.MouseEvent e) { 
       dragged = null; 
       lastLocation = null; 
      } 

      @Override 
      public void mouseClicked(java.awt.event.MouseEvent e) { 
       if (SwingUtilities.isLeftMouseButton(e)) { 
        if (e.getClickCount() == 1) { 
         addPoint(e.getX(), e.getY()); 
        } else if (e.getClickCount() == 2) { 
         createPolygon(); 
        } 
       } else if (SwingUtilities.isRightMouseButton(e)) { 
        clearCurrentPolygon(); 
       } 
      } 

     }; 

     public Drawing() { 
      addMouseListener(mouseListener); 
      addMouseMotionListener(mouseListener); 
     } 

     protected void addPoint(int x, int y) { 
      currentPolygon.addPoint(x, y); 
      repaint(); 
     } 

     protected void clearCurrentPolygon() { 
      currentPolygon = new Polygon(); 
      repaint(); 
     } 

     protected void createPolygon() { 
      if (currentPolygon.npoints > 2) { 
       polygons.add(currentPolygon); 
      } 
      clearCurrentPolygon(); 
      repaint(); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(PANEL_WIDTH, PANEL_HEIGHT); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.setColor(Color.RED); 
      g.setFont(FONT); 
      for (Polygon polygon : polygons) { 
       drawPolygon(g, polygon); 
      } 
      g.setColor(Color.GREEN); 
      drawPolygon(g, currentPolygon); 
     } 

     private void drawPolygon(Graphics g, Polygon polygon) { 
      if (polygon.npoints < 3) { 
       if (polygon.npoints == 1) { 
        g.fillOval(polygon.xpoints[0] - 2, polygon.ypoints[0] - 2, 4, 4); 
        drawNthPoint(g, polygon, 0); 
       } else if (polygon.npoints == 2) { 
        g.drawLine(polygon.xpoints[0], polygon.ypoints[0], polygon.xpoints[1], polygon.ypoints[1]); 
        drawNthPoint(g, polygon, 0); 
        drawNthPoint(g, polygon, 1); 
       } 
      } else { 
       g.drawPolygon(polygon); 
       for (int i = 0; i < polygon.npoints; i++) { 
        drawNthPoint(g, polygon, i); 
       } 
      } 
     } 

     private void drawNthPoint(Graphics g, Polygon polygon, int nth) { 
      // Only works 26 times! 
      String name = Character.toString((char) ('A' + nth)); 
      int x = polygon.xpoints[nth]; 
      int height = g.getFontMetrics().getHeight(); 
      int y = polygon.ypoints[nth] < height ? polygon.ypoints[nth] + height : polygon.ypoints[nth]; 
      Rectangle2D stringBounds = g.getFontMetrics().getStringBounds(name, g); 
      g.drawString(name, x, y); 
     } 

    } 

    protected static void initUI() { 
     JFrame frame = new JFrame("test"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new Drawing()); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       initUI(); 
      } 
     }); 
    } 
} 
관련 문제