setOnMouseEntered和setOnMouseExited foreverloop

时间:2014-02-05 19:54:54

标签: javafx

我使用来自controlsfx的PopOver来显示来自TableCell的细节数据。我使用tableCellFactory来创建单独的PopOvers。我对此代码有疑问:

public class PopupTableCell extends TableCell {
@Override
protected void updateItem(final Object item, boolean empty) {
    super.updateItem(item, empty);
    if (empty){
        setText(null);
    } //if
    else {
        setText(item.toString());
        // PopUp Anzeigen.
        final PopOver PopUp = new PopOver();
        PopUp.setContentNode(new Label(item.toString()));



        setOnMouseEntered(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent mouseEvent) {
                Point MouseLocation = MouseInfo.getPointerInfo().getLocation();
                PopUp.show(PopupTableCell.this, MouseLocation.getX(), MouseLocation.getY());
                System.out.println("entered");

            }
        });
        setOnMouseExited(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent mouseEvent) {
                System.out.println("exited");
            PopUp.hide();
            }
        });
  }
}

当我将光标放在单元格上时,它会开始永久地触发输入和退出的事件(即使使用不移动的鼠标光标也是如此)。 我怎样才能达到想要的行为: 鼠标在表格单元格内 - &gt; popover.show() 鼠标离开表格单元格 - &gt; popover.hide()

1 个答案:

答案 0 :(得分:3)

这就是我为我解决同样问题的方法。

owner.setOnMouseMoved(evt -> {           
  if (owner.getLayoutBounds().contains(evt.getX(), evt.getY())) {                
    if (!popOver.isShowing()) {
      popOver.show(owner);
    }
  }
});

owner.setOnMouseExited(evt -> {
  if (owner.getLayoutBounds().contains(evt.getX(), evt.getY())) {
    if (!popOver.isShowing())
      popOver.show(owner);
  } else {
    popOver.hide();
  }
});