2013-06-30 4 views
0

Таким образом, я добавляю Ellipse2D.Float в JPanel (и в ArrayList) при нажатии. Я хочу знать, можно ли после этого выполнить перемещение фигуры (скажем, с помощью щелчка). На данный момент это кажется статичным, и я не могу его перетащить.Перемещение эллипса, которое было нарисовано

Кроме того, возможно ли соединить два круга с линией таким образом, что линия соединяет два круга по существу; когда круг перемещается, линия изменяется, чтобы следовать за кругами.

Я просто смотрю, возможно ли это, я начал кодирование, но не могу понять, как это сделать. Любые ответы, ссылки, фрагменты кода оцениваются!

+0

Стандартный чертеж - это только чертеж. Он сразу растёт (т. Е. Поворачивает пути, определенные фигурами графическому объекту). Таким образом, объекты «перестают существовать» как независимые объекты (и на самом деле никогда не могут напрямую реагировать на события пользовательского интерфейса). Вам придется обрабатывать макет/график объекта (и соединения) независимо от чертежа - и затем рисовать макет/график по мере необходимости (после обновления указанных объектов). Конечно, для этого существуют существующие библиотеки, я уверен. – user2246674

+0

Вы можете рассмотреть приведенный пример [здесь] (http://stackoverflow.com/a/11944233/230513). – trashgod

+0

вам нужно отслеживать каждый объект, который вы хотите нарисовать в списке С ТОЧКАМИ !, и для любого движения просто очистите (не целую графику) контейнер и перерисуйте содержимое новыми точками, вокруг кругов и линий вы добавите что-то вроде движения интерфейс к объекту src для перемещения связанного объекта, который запускается (запускается) с помощью перемещения src –

ответ

3

У вас есть основная идея. Обнаружите щелчок мышью, нарисуйте новую фигуру.

Следующий шаг - знать, когда нажата клавиша смены и узнать, какая последняя (или выбранная) фигура была, а затем обновить ее положение.

Для меня самым простым решением было бы поддерживать некоторую информацию о форме и ее положении. В этом примере я использовал простой класс Drawable, который не только объединяет положение и форму, но также имеет простой способ draw, чтобы сделать жизнь проще.

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Point; 
import java.awt.Shape; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.geom.Ellipse2D; 
import java.util.ArrayList; 
import java.util.List; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class ShiftShape { 

    public static void main(String[] args) { 
     new ShiftShape(); 
    } 

    public ShiftShape() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private List<Drawable> drawables; 

     public TestPane() { 
      drawables = new ArrayList<Drawable>(25); 
      addMouseListener(new MouseAdapter() { 

       @Override 
       public void mouseClicked(MouseEvent e) { 
        Drawable drawable = null; 

        if ((e.getModifiersEx() & MouseEvent.SHIFT_DOWN_MASK) == MouseEvent.SHIFT_DOWN_MASK) { 

         if (!drawables.isEmpty()) { 

          drawable = drawables.get(drawables.size() - 1); 

         } 

        } else { 

         drawable = new Drawable(); 
         drawables.add(drawable); 

        } 

        if (drawable != null) { 

         drawable.setLocation(e.getPoint()); 
         repaint(); 

        } 
       } 
      }); 
     } 

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

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      for (Drawable drawable : drawables) { 
       drawable.draw(g2d); 
      } 
      g2d.dispose(); 
     } 

     public class Drawable { 

      private Point location; 
      private Shape shape; 

      public Drawable() { 

       shape = new Ellipse2D.Float(0, 0, 20, 20); 

      } 

      public void setLocation(Point location) { 
       this.location = location; 
      } 

      public Point getLocation() { 
       return location; 
      } 

      public void draw(Graphics2D g2d) { 

       Point p = getLocation(); 
       int x = p.x - 10; 
       int y = p.y - 10; 
       g2d.translate(x, y); 
       g2d.draw(shape); 
       g2d.translate(-x, -y); 

      } 

     } 
    } 
} 

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

  • Нет связанных вопросов^_^