2014-10-22 58 views
0

所以,我畫線使用Path2D和這樣做:單擊並拖動Path2D線的JPanel

Path2D linePath = new Path2D.Double(); 
linePath.moveTo(startingX, startingY); 
linePath.lineTo(endingX, endingY); 
repaint(); 

我所試圖做的是點擊並拖動周圍的線。就目前而言,我不想更改該行的結構(長度等),我只是想移動線路。我知道你可以使用Path2D.contains(e.getPoint)作爲封閉的形狀,但這不適用於線條。有任何想法嗎?由於

全碼

import java.awt.BasicStroke; 
import java.awt.Color; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Panel; 
import java.awt.Point; 
import java.awt.RenderingHints; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.geom.Path2D; 
import java.util.ArrayList; 
import java.util.List; 

import javax.swing.JFrame; 
import javax.swing.JMenuBar; 
import javax.swing.JMenuItem; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Editor { 

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

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

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

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

      setSize(300, 200); 
      setLocationRelativeTo(null); 
      setDefaultCloseOperation(EXIT_ON_CLOSE); 

      JMenuItem lineMenuItem = new JMenuItem("New Line"); 
      lineMenuItem.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent event) { 
        System.out.println("adding line"); 
        shapeList.addLine(); 
       } 
      }); 

      JMenuBar menubar = new JMenuBar(); 

      menubar.add(lineMenuItem); 

      setJMenuBar(menubar); 

      // shapeList.addLine(); 
     } 
    } 

    // Shapes class, used to draw the shapes on the panel 
    // as well as implements the MouseListener for dragging 
    public static class Shapes extends JPanel { 

     private static final long serialVersionUID = 1L; 

     private List<Path2D> lines = new ArrayList<Path2D>(); 
     private Boolean drawing = false; 
     private Point lineStartingPoint = new Point(); 
     private Point lineEndingPoint = new Point(); 
     private Path2D.Double linePath; 

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

     public void addLine() { 
      drawing = true; 
      repaint(); 
     } 

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

      Graphics2D g2 = (Graphics2D) g; 
      g2.setStroke(new BasicStroke(2)); 
      if (drawing) { 
       g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
         RenderingHints.VALUE_ANTIALIAS_ON); 
       g2.setStroke(new BasicStroke(2)); 
       g2.drawLine(lineStartingPoint.x, lineStartingPoint.y, 
         lineEndingPoint.x, lineEndingPoint.y); 
      } 
      for (Path2D shape : lines) { 
       g2.setColor(Color.BLACK); 
       g2.draw(shape); 
      } 
     } 

     class MyMouseAdapter extends MouseAdapter { 

      @Override 
      public void mousePressed(MouseEvent e) { 
       if (drawing) { 
        lineStartingPoint = e.getPoint(); 
        lineEndingPoint = lineStartingPoint; 
       } 
      } 

      @Override 
      public void mouseDragged(MouseEvent e) { 
       if (drawing) { 
        lineEndingPoint = e.getPoint(); 
        repaint(); 
        System.out.println(lines.size()); 
       } 
      } 

      @Override 
      public void mouseReleased(MouseEvent e) { 
       if (drawing) { 
        drawLine(e); 
        drawing = false; 
       } 
      } 

      public void drawLine(MouseEvent e) { 
       drawing = false; 
       lineEndingPoint = e.getPoint(); 
       linePath = new Path2D.Double(); 
       linePath.moveTo(lineStartingPoint.getX(), 
         lineStartingPoint.getY()); 
       linePath.lineTo(lineEndingPoint.getX(), lineEndingPoint.getY()); 
       lines.add(linePath); 
       repaint(); 
      } 

     } 
    } 
} 
+0

根據你想達到的目的,你可以使用'Path2D#getBounds#contains' – MadProgrammer 2014-10-22 02:00:55

+0

嗯......是的,這其實是真的,我可以移動邊界,對嗎?我只是想能夠移動線路。最終我會做到這一點,以便我可以單擊並拖動一行的末尾,並且行的末尾將移動/調整大小以適應行進的方向 – Harry 2014-10-22 02:04:06

+0

本質上,您所做的只是以任何方式更改邊界框,這只是你似乎擔心的視覺表現。鑑於你只處理'Path2D',你必須做一堆檢查和鑄造來處理所有可能的形狀......只是說;) – MadProgrammer 2014-10-22 02:06:58

回答

1

您可以使用BasicStroke

public Shape createStrokedShape(Shape s) 

定義線的厚度,通過你的Path2D並獲得那種你的路徑的輪廓。檢查輪廓是否包含鼠標位置。如果它包含您的鼠標超過了Path2D,您可以拖動該形狀。