2013-06-30 74 views
0

因此,我單擊時將一個Ellipse2D.Float添加到JPanel(和ArrayList)。我想知道如果這樣做完成後,我可以移動形狀(例如,通過按住shift鍵點擊)。目前它似乎是靜止的,我無法將它拖到任何地方。移動已繪製的橢圓

此外,是否有可能用線連接兩個圓,使得這條線永久連接兩個圓;當一個圓圈移動時,線條被改變以跟隨圓圈。

我只是想看看這是否可行,我已經開始編碼,但無法找到如何做這兩件事情。任何答案,鏈接,代碼片段表示讚賞!

+0

標準圖紙就是這樣 - 繪圖。它立即生成柵格(即將形狀定義的路徑轉換爲圖形對象)。因此,這些對象作爲獨立實體「不復存在」(實際上從來不能直接響應UI事件)。您必須獨立於圖形處理對象佈局/圖形(和連接) - 然後根據需要繪製佈局/圖形(在更新所述對象之後)。當然,我確定有這樣的庫。 – user2246674

+0

您可以查看[此處]引用的示例(http://stackoverflow.com/a/11944233/230513)。 – trashgod

+0

你需要跟蹤你想在List WITH POINTS!中繪製的每個對象,並且對於任何移動只需清除(不是整個圖形)容器並用新的點重新繪製內容,關於要添加像運動的圓和線接口到src對象,將關聯對象移動到,由src移動觸發(觸發) – 2013-06-30 22:01:52

回答

3

你有基本的想法。檢測鼠標點擊,繪製新的形狀。

下一步是要知道何時按下shift鍵並知道最後(或選定)形狀是什麼,然後才能更新它的位置。

對我來說,最簡單的解決方案是以某種方式維護形狀和位置信息。在這個例子中,我使用了一個簡單的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); 

      } 

     } 
    } 
}