2014-10-17 3 views
3

그래서 JPanel에 정사각형을 추가하고 사용자가 패널 주위로 모양을 드래그 할 수있게하는 프로그램이 있습니다. 원하는 것은 도형의 오른쪽 하단을 클릭하고 사용자가 드래그 할 때 크기를 조절할 수 있습니다. 나는 이것을하는 방법에 붙어있는 종류입니다. 나는 사용자가 드래그 할 때 마우스가있는 곳의 하단 오른쪽 구석을 만들기 위해 사각형의 길이와 너비를 다시 계산해야 할 필요가 있음을 알고있다. 그러나 사각형의 오른쪽 아래 가장자리에서 클릭을 어떻게 감지 할 수 있습니까? 어떤 도움을 주셔서 감사합니다.사용자가 클릭하여 끌 때 Path2D 모양 크기 조정

import java.awt.BasicStroke; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Panel; 
import java.awt.Point; 
import java.awt.Rectangle; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.geom.AffineTransform; 
import java.awt.geom.Path2D; 
import java.io.File; 
import java.util.ArrayList; 
import java.util.List; 

import javax.swing.JFileChooser; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class UMLEditor { 

    public static void main(String[] args) { 

     JFrame frame = new UMLWindow(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setBounds(30, 30, 1000, 700); 
     frame.getContentPane().setBackground(Color.white); 
     frame.setVisible(true); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 

class UMLWindow extends JFrame { 
    Shapes shapeList = new Shapes(); 
    Panel panel; 

    private static final long serialVersionUID = 1L; 

    public UMLWindow() { 
     addMenus(); 
     panel = new Panel(); 
    } 

    public void addMenus() { 

     getContentPane().add(shapeList); 

     setTitle("UML Editior"); 
     setSize(300, 200); 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 

     shapeList.addSquare(100, 100); 
    } 

    public void loadFile() { 
     JFileChooser chooser = new JFileChooser(); 
     chooser.setCurrentDirectory(new File(".")); 

     int r = chooser.showOpenDialog(this); 
     if (r == JFileChooser.APPROVE_OPTION) { 
     } 
    } 
} 

// Shapes class, used to draw the shapes on the panel 
// as well as implements the MouseListener for dragging 
class Shapes extends JPanel { 
    private static final long serialVersionUID = 1L; 

    private List<Path2D> shapes = new ArrayList<Path2D>(); 
    int currentIndex; 

    public Shapes() { 
     MyMouseAdapter myMouseAdapter = new MyMouseAdapter(); 
     addMouseListener(myMouseAdapter); 
     addMouseMotionListener(myMouseAdapter); 
    } 

    public void addSquare(int width, int height) { 
     Path2D rect2 = new Path2D.Double(); 
     rect2.append(new Rectangle(getWidth()/2 - width/2, getHeight()/2 
       - height/2, width, height), true); 

     shapes.add(rect2); 
     repaint(); 
    } 

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

     Graphics2D g2 = (Graphics2D) g; 
     g2.setStroke(new BasicStroke(2)); 
     for (Path2D shape : shapes) { 
      g2.draw(shape); 
     } 
    } 

    class MyMouseAdapter extends MouseAdapter { 
     private boolean pressed = false; 
     private Point point; 

     @Override 
     public void mousePressed(MouseEvent e) { 
      if (e.getButton() != MouseEvent.BUTTON1) { 
       return; 
      } 
      for (int i = 0; i < shapes.size(); i++) { 
       if (shapes.get(i) != null 
         && shapes.get(i).contains(e.getPoint())) { 
        currentIndex = i; 
        pressed = true; 
        this.point = e.getPoint(); 
       } 
      } 
     } 

     @Override 
     public void mouseDragged(MouseEvent e) { 
      if (pressed) { 
       int deltaX = e.getX() - point.x; 
       int deltaY = e.getY() - point.y; 
       shapes.get(currentIndex).transform(
         AffineTransform.getTranslateInstance(deltaX, deltaY)); 
       point = e.getPoint(); 
       repaint(); 
      } 
     } 

     @Override 
     public void mouseReleased(MouseEvent e) { 
      pressed = false; 
     } 
    } 
} 

답변

1

나는이 당신이이 모양을 다루는 사용자들은에 (지역 '원하는의 종류 AreaManager (http://sourceforge.net/p/tus/code/HEAD/tree/tjacobs/ui/shape/),

시작하는 당신에게 도움이 될 수 다시 하루에 몇 가지를 썼다 실제로,). 마우스 끌기를 사용하는 dragger 클래스와 마우스 휠을 사용하는 resizer 클래스가 있습니다. 하지만 이것은 정확히 사용자 인터페이스가 아닙니다.

커서 유형 변경 및 마우스 끌기에 따라 크기를 조정할 수있는 사용자 인터페이스는 Draggable in http://sourceforge.net/p/tus/code/HEAD/tree/tjacobs/ui/drag/입니다. layoutmanager가 꺼진 상태로 컨테이너에 포함 된 구성 요소로 Draggable이 작동합니다. 그러나 당신의 목적에 적응하는 것은 그렇게 복잡하지 않아야합니다.