2014-09-27 6 views
0

그래서 JMenu 항목 "New Rectangle"을 클릭하고 화면 중앙에 도형을 추가하는 간단한 프로그램이 있습니다. 내 질문은 : 어떻게 창 주위를 클릭하고 드래그 할 수 있습니까? 나는 어떤 유형의 마우스 리스너가 필요할 것임을 알고 있지만 정확히 구현하는 방법을 모르겠습니다.클릭하여 드래그하여 JPanel에서 도형을 이동하는 방법

public class SimpleDraw { 

    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); 

     // Display the window. 
     frame.setVisible(true); 

    } 
} 

class UMLWindow extends JFrame { 
    Squares squares = new Squares(); 

    private static final long serialVersionUID = 1L; 

    public UMLWindow() { 
     addMenus(); 
    } 

    public void addMenus() { 

     getContentPane().add(squares); 

     JMenuBar menubar = new JMenuBar(); 

     JMenu shapes = new JMenu("Shapes"); 

     JMenuItem rectangleMenuItem = new JMenuItem("New Rectangle"); 
     rectangleMenuItem.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent event) { 
       squares.addSquare(10, 10, 100, 100); 
      } 
     }); 

     shapes.add(rectangleMenuItem); 

     menubar.add(shapes); 

     setJMenuBar(menubar); 

     setDefaultCloseOperation(EXIT_ON_CLOSE); 
    } 

} 

class Squares extends JPanel { 
    private static final long serialVersionUID = 1L; 

    private List<Rectangle> squares = new ArrayList<Rectangle>(); 

    public void addSquare(int x, int y, int width, int height) { 
     Rectangle rect = new Rectangle(getWidth()/2 - width/2, getHeight() 
       /2 - height/2, width, height); 
     squares.add(rect); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     this.setOpaque(true); 
     this.setBackground(Color.WHITE); 
     Graphics2D g2 = (Graphics2D) g; 
     for (Rectangle rect : squares) { 
      g2.draw(rect); 
     } 
     repaint(); 
    } 
} 
+0

AffineTransform을 사용하여 [이 답변] (http://stackoverflow.com/a)에서와 같이 Shape 객체를 변환하는 것이 하나의 방법입니다./22595225/522444). –

+0

http://docs.oracle.com/javase/tutorial/uiswing/dnd/intro.html – DavidPostill

+2

MouseListener 및 MouseMotionListener가 필요합니다. – MadProgrammer

답변

0

아마 당신을 도울 수 있습니다

코드

http://zetcode.com/tutorials/javaswingtutorial/resizablecomponent/

단점을이 코드에서 우리가 레이아웃 매니저를하지 않습니다. 따라서이 jframe의 크기를 조정할 때 jframe의 중심에 구성 요소가 있으면이 구성 요소가 jframe의 구석에 표시 될 수 있습니다. 이 문제는 해결할 수 있지만 조금 복잡합니다. 원한다면이 문제에 관해 이야기 할 수 있습니다.

+0

크기를 조정하는 것처럼 보입니다. 나는 크기를 바꾸려고하지 않습니다. 전체 개체를 클릭하고 창에서 다른 위치로 균열 싶습니다 (그러나 같은 크기로 유지됩니다). – Harry

+0

예,이 코드는 이러한 기능을 지원합니다. 다른 위치에 구성 요소를 끌어서 놓고이 구성 요소의 크기를 조정하십시오. 사실 추가 기능이 있습니다. 이 리사이징 기능이 필요하지 않은 경우 Resizable 클래스를 편집 할 수 있습니다.이 경우는 대소 문자가 있습니다. case Cursor.MOVE_CURSOR :. 나는 당신이 즐거운 코드를 갖도록 도울 수 있는지 모른다. – Shomeis

관련 문제