2013-11-14 3 views
0

Этот код моей программы. Вы можете дать несколько советов, чтобы сделать другие прямоугольники могут двигаться, как 1-ыйПеретаскивание нескольких/разных компонентов

Примечание: первый прямоугольник является только один может быть перетащить

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.event.MouseInputAdapter; 

public class GraphicDragAndDrop extends JPanel { 

     Rectangle and = new Rectangle(5,5,75,75); 
     Rectangle or = new Rectangle(5,105,75,75); 
     Rectangle xnor = new Rectangle(5,205,75,75); 
     Rectangle nand = new Rectangle(5,305,75,75); 
     Rectangle xor = new Rectangle(5,405,75,75); 
     Rectangle inverter = new Rectangle(5,505,75,75); 

    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2 = (Graphics2D)g; 
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
          RenderingHints.VALUE_ANTIALIAS_ON); 
     g2.setPaint(Color.blue); 
     g2.draw(and); 

     Graphics2D g3 = (Graphics2D)g; 
     g3.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
          RenderingHints.VALUE_ANTIALIAS_ON); 
     g3.setPaint(Color.red); 
     g3.draw(or); 

     Graphics2D g4 = (Graphics2D)g; 
     g4.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
          RenderingHints.VALUE_ANTIALIAS_ON); 
     g4.setPaint(Color.blue); 
     g4.draw(xnor); 

     Graphics2D g5 = (Graphics2D)g; 
     g5.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
          RenderingHints.VALUE_ANTIALIAS_ON); 
     g5.setPaint(Color.red); 
     g5.draw(nand); 

     Graphics2D g6 = (Graphics2D)g; 
     g6.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
          RenderingHints.VALUE_ANTIALIAS_ON); 
     g6.setPaint(Color.blue); 
     g6.draw(xor); 


     Graphics2D g7 = (Graphics2D)g; 
     g7.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
          RenderingHints.VALUE_ANTIALIAS_ON); 
     g7.setPaint(Color.red); 
     g7.draw(inverter); 
    } 

    public void setRect(int x, int y) { 

     and.setLocation(x, y); 
      repaint(); 

    } 

    public static void main(String[] args) { 
     GraphicDragAndDrop test = new GraphicDragAndDrop(); 
     new GraphicDragController(test); 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(test); 
     f.setSize(400,400); 
     f.setLocation(100,100); 
     f.setVisible(true); 
    } 
} 

class GraphicDragController extends MouseInputAdapter { 
    GraphicDragAndDrop component; 
    Point offset = new Point(); 
    boolean dragging = false; 

    public GraphicDragController(GraphicDragAndDrop gdad) { 
     component = gdad; 
     component.addMouseListener(this); 
     component.addMouseMotionListener(this); 
    } 

    public void mousePressed(MouseEvent e) { 
     Point p = e.getPoint(); 
     Rectangle r = component.and; 
     Rectangle a = component.or; 
     if(r.contains(p)) { 
      offset.x = p.x - r.x; 
      offset.y = p.y - r.y; 
      dragging = true; 
    } 
    } 
    public void mouseReleased(MouseEvent e) { 
     dragging = false; 
    } 

    public void mouseDragged(MouseEvent e) { 
     if(dragging) { 
      int x = e.getX() - offset.x; 
      int y = e.getY() - offset.y; 
      component.setRect(x, y); 
     } 


    } 
} 

Все виды помощи будут оценены спасибо:)

+0

Вам нужен только один графический объект для рисования каждого прямоугольника. – camickr

ответ

2

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

Вы должны изменить весь дизайн вашего класса:

  1. не прописывать код прямоугольников. Вам понадобится ArrayList, чтобы отслеживать все прямоугольники и цвет каждого прямоугольника.

  2. В коде MouseListener вам необходимо выполнить итерацию через этот список, чтобы узнать, с каким Rectangle вы нажали, используя contains (. ..) метода прямоугольника и точки мыши из MouseEvent.

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

  4. Логика paintComponent() должна быть изменена для повторения через ArrayList для рисования каждого прямоугольника. Прежде чем пытаться исправить проблему перетаскивания, вы должны сначала отредактировать эту часть своего кода. Вы можете проверить Playing With Shapes на некоторые идеи о том, как рисовать объекты Shape из ArrayList.

Возможно, есть и другие проблемы, но, надеюсь, это поможет вам начать работу в правильном направлении.

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