2014-09-27 4 views
0

Итак, у меня есть эта простая программа, которая позволяет вам щелкнуть элемент JMenu «Новый прямоугольник» и добавляет фигуру в центр экрана. Мой вопрос: как я могу щелкнуть и перетащить его вокруг окна? Я знаю, что мне понадобится какой-то тип Mouse Listener, но я точно не знаю, как его реализовать.Как перемещать фигуры в 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 для перевода объекта Shape, как показано в [этом ответе] (http://stackoverflow.com/a/22595225/522444). –

+0

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

+2

Вам понадобится MouseListener и MouseMotionListener – MadProgrammer

ответ

0

Может быть, это может помочь вам:

невыгоде кода

В этом коде мы не макет менеджера. Поэтому, если у нас есть компонент в центре jframe, когда эта jframe повторно заправляет, этот компонент может отображаться в углу jframe. Вы можете решить эту проблему, но она немного сложна. Мы можем поговорить об этой проблеме, если хотите.

+0

Это похоже на изменение размера. Я не хочу изменять размер. Я хочу щелкнуть и взломать весь объект в другое место в окне (но он останется того же размера) – Harry

+0

Да, этот код поддерживает следующие возможности: перетащите компонент в другое место и измените размер этого компонента. На самом деле он имеет дополнительную функцию. Если вам не нужна эта функция повторного калибровки, мы можем редактировать класс Resizable, и у нас есть только этот случай: case Cursor.MOVE_CURSOR:. Я не знаю, что это может помочь вам получить ваш приятный код или нет. – Shomeis

Смежные вопросы