2016-12-03 3 views
5

Я создаю прямоугольную программу рисования. Квадрат рисуется, только если программа перетаскивается в нижнюю сторону. Даже если перетаскивание в другом направлении, я хочу, чтобы квадраты были нарисованы правильно. Как я могу это исправить? Пожалуйста, помогите мне.Java swing draw rectangle in mouse drag and drop

**DrawRect.java** 


    import javax.swing.*; 

    import java.awt.*; 

    import java.awt.event.*; 

    public class DrawRect extends JPanel { 

     int x, y, w, h; 
     public static void main(String [] args) { 
      JFrame f = new JFrame("Draw Box Mouse 2"); 
      f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      f.setContentPane(new DrawRect()); 
      f.setSize(300, 300); f.setVisible(true); 
     } 



     DrawRect() { 
      x = y = w = h = 0; // 
      MyMouseListener listener = new MyMouseListener(); 
      addMouseListener(listener); 
      addMouseMotionListener(listener);  
     } 

     public void setStartPoint(int x, int y) { 
      this.x = x; this.y = y; 
     } 

     public void setEndPoint(int x, int y) { 
      w = Math.abs(this.x - x); 
      h = Math.abs(this.y - y); 
     } 

     class MyMouseListener extends MouseAdapter { 
      public void mousePressed(MouseEvent e) { 
       setStartPoint(e.getX(), e.getY()); 
      } 
      public void mouseDragged(MouseEvent e) { 
       setEndPoint(e.getX(), e.getY()); repaint(); 
      } 
      public void mouseReleased(MouseEvent e) { 
       setEndPoint(e.getX(), e.getY()); repaint(); 
      } 
     } 

     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.setColor(Color.RED); 

Please help me. 
      g.drawRect(x, y, w, h); 

     } 



    } 

ответ

4

Попробуйте что-нибудь подобное. Вы должны определить начальную точку внимательно. Стартовая точка - это минуты x и y точек 1-й и последней координат мыши.

вот шаги, чтобы решить эту проблему

  1. принять первую координату, когда мышь clicke х, у
  2. занимают последние координаты при наведении курсора мыши перетащить x2, y2
  3. взять мин координаты х и у как точка отсчета for drawRect Math.min(x,x2);
  4. использовать абсолютное значение разности координат для расчета высоты и ширины прямоугольника. Math.abs(x-x2);

код

import javax.swing.*; 

import java.awt.*; 

import java.awt.event.*; 

    public class DrawRect extends JPanel { 

     int x, y, x2, y2; 

     public static void main(String[] args) { 
      JFrame f = new JFrame("Draw Box Mouse 2"); 
      f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      f.setContentPane(new DrawRect()); 
      f.setSize(300, 300); 
      f.setVisible(true); 
     } 

     DrawRect() { 
      x = y = x2 = y2 = 0; // 
      MyMouseListener listener = new MyMouseListener(); 
      addMouseListener(listener); 
      addMouseMotionListener(listener); 
     } 

     public void setStartPoint(int x, int y) { 
      this.x = x; 
      this.y = y; 
     } 

     public void setEndPoint(int x, int y) { 
      x2 = (x); 
      y2 = (y); 
     } 

     public void drawPerfectRect(Graphics g, int x, int y, int x2, int y2) { 
      int px = Math.min(x,x2); 
      int py = Math.min(y,y2); 
      int pw=Math.abs(x-x2); 
      int ph=Math.abs(y-y2); 
      g.drawRect(px, py, pw, ph); 
     } 

     class MyMouseListener extends MouseAdapter { 

      public void mousePressed(MouseEvent e) { 
       setStartPoint(e.getX(), e.getY()); 
      } 

      public void mouseDragged(MouseEvent e) { 
       setEndPoint(e.getX(), e.getY()); 
       repaint(); 
      } 

      public void mouseReleased(MouseEvent e) { 
       setEndPoint(e.getX(), e.getY()); 
       repaint(); 
      } 
     } 

     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.setColor(Color.RED); 
      drawPerfectRect(g, x, y, x2, y2); 
     } 

    } 
+1

Я имею в виду это. Спасибо –

+0

Не можем ли мы взять этот прямоугольник? каждый раз, когда мы нажимаем последний потерянный? –