Line2d vector

时间:2018-05-15 16:20:24

标签: java graphics mouseevent graphics2d

我对听众的尝试不是很充实。我有一个Line2D矢量(代表平面图墙)。我在JFrame中绘制它们。

我尝试在这些行上设置一个侦听器,以便能够在点击时设置它们(更改颜色等)。

我迷失了,因为我真的不知道把听众放在哪里。我在许多论坛上尝试过很多东西,但没有任何作用。

感谢。

EDIT1:

嗨,谢谢你的回答,这是一个有很多课程的大项目,所以我会发布代码并描述它是如何吵闹的。首先我用平面图导入图像。我有一个带有Action的类,它扩展了AbstractAction。我使用opencv进行线条提取。我将提取的行存储在Vector of Walls(我创建的类)中。

 Vector<wall> walls

这是我的墙类

//a wall is represented by 2 points (pInitial and pFInal)
private Point pInitial, pFinal;
private double wallAttenuation;
private int wallType;


 public wall(Point p1, Point p2) {
// p1 is lower by the height than p2
if (p1.getY() > p2.getY()) {
    pInitial = p2;
    pFinal = p1;
} else {
    pInitial = p1;
    pFinal = p2;
}
}

//method to set the attenuation of the wall
public void setWallAttenuation(double a) {
    wallAttenuation = a;
}

//methods to set both ends of the wall

 public void  setPInitial(Point P1) {
 pInitial.x=(int)P1.getX();
 pInitial.x=(int)P1.getY();

}

public void  setPFinal(Point P2) {
   pFinal.x=(int)P2.getX();
   pFinal.x=(int)P2.getY();
}

//methods to get wall attributes (attenuation , ends and type)
public double getWallAttenuation() {
return wallAttenuation;
}

 public Point getPInitial() {
   return pInitial;
 }

 public Point getPFinal() {
    return pFinal;
  }

  public void setWallType(int type) {
     wallType = type;
  }

   public int getWallType() {
      return wallType;
  }

现在在我的importAction类中,并且在处理之后我有这个墙的向量(每个墙由起点和终点定义。之后,我打开一个新的框架,我绘制线条。我希望能够点击在每面墙上进行进一步修改。

首先,我尝试使用鼠标事件处理创建一个Frame类:

public class CreateJFrameWindowWithMouseEventHandling extends JFrame implements MouseMotionListener,MouseListener {

  private static final long serialVersionUID = 1L;

  public CreateJFrameWindowWithMouseEventHandling() {
       setTitle("Walls calibration");
      addMouseListener(this);
   }

   @Override
   public void mouseClicked(MouseEvent e) {
      int x = e.getX();
     int y = e.getY();
     System.out.println("Mouse Clicked at X: " + x + " - Y: " + y);
   }

  @Override
  public void mouseEntered(MouseEvent e) {
     int x = e.getX();
     int y = e.getY();
     System.out.println("Mouse Entered frame at X: " + x + " - Y: " + y);
  }

  @Override
  public void mouseExited(MouseEvent e) {
      int x = e.getX();
      int y = e.getY();
      System.out.println("Mouse Exited frame at X: " + x + " - Y: " + y);
   }

   @Override
   public void mousePressed(MouseEvent e) {
   int x = e.getX();
   int y = e.getY();
   System.out.println("Mouse Pressed at X: " + x + " - Y: " + y);
   }

   @Override
   public void mouseReleased(MouseEvent e) {
   int x = e.getX();
   int y = e.getY();
   System.out.println("Mouse Released at X: " + x + " - Y: " + y);
   }

  @Override
  public void mouseDragged(MouseEvent e) {
  }

  @Override
 public void mouseMoved(MouseEvent e) {
  int x = e.getX();
   int y = e.getY();
   System.out.println("Mouse  at X: " + x + " - Y: " + y);
   repaint();

  }


  private static void createAndShowGUI() {

  //Create and set up the window.

  JFrame frame = new CreateJFrameWindowWithMouseEventHandling();

  //Display the window.
  frame.setVisible(true);
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }

但我想这不是正确的解决方案。接下来我尝试的是创建JPanel浏览向量,绘制当前行并添加一个监听器。检查它是否有效如果鼠标在一条线上,我会更改光标:

   JFrame wallsEdit = new JFrame("Walls Calibration");                     
   wallsEdit.add(new JPanel() {

    @Override
    protected void paintComponent(Graphics g) {
             Graphics2D g2 = (Graphics2D)g;
              for(int i=0;i<walls.size();i++)
              {
                  Point p1 = walls.get(i).getPInitial();
                  Point p2 = editor.walls.get(i).getPFinal();

                  g2.setColor(Color.black);
                  g2.setStroke(new BasicStroke(10));
                  g2.drawLine((int)p1.getX(),(int)p1.getY(), (int)p2.getX(),(int)p2.getY());

                  walls.get(i).addMouseListener(new MouseAdapter() {
                           public void mouseMoved(MouseEvent e) {

                            Point CursorPoint= MouseInfo.getPointerInfo().getLocation();
                  double x = CursorPoint.getX(); 
                  double y = CursorPoint.getY(); 
                 Line2D.Double current =                                                         new Line2D.Double(p1.getX(),p1.getY(),p2.getX(),p2.getY()) ;

                  if(current.intersectsLine(x, y, x, y))
                  { setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR)); 
                  } else {  setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));   
                   } 
                   repaint();
                     });
                    }

                  }

                  }, BorderLayout.CENTER);

    wallsEdit.setAlwaysOnTop(true);
    wallsEdit.setVisible(true);
    wallsEdit.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);

当然这不起作用。所以尝试了另一件事。我声明我的Wall类扩展了Component并实现了mouseMotionListener和MouseListener。在里面我为面板编写了mouseMoved事件。

希望我提供所有必要的细节。任何帮助将不胜感激,非常感谢

0 个答案:

没有答案