试图在 scalafx 中获取用户最新的鼠标点击

Trying to get user's latest mouse click in scalafx

我正在尝试获取用户最近的鼠标点击以显示正确的 table。但是,我找不到任何方法来实现这个想法。如何使用 mouseEvent 函数获取用户最近的鼠标点击?

我尝试使用 if else 语句,但当 monstersTable1 中仍有值时它不起作用

def handleEditMonster(action : ActionEvent) = {
    val selectedMonster1 = monstersTable1.selectionModel().selectedItem.value
    val selectedMonster2 = monstersTable2.selectionModel().selectedItem.value

    if (selectedMonster1 != null){
        val okClicked = MainApp.showMonsterEditDialog(selectedMonster1)
        if (okClicked) showMonstersDetails(Some(selectedMonster1))

    } else if (selectedMonster2 != null) {
        val okClicked = MainApp.showMonsterEditDialog(selectedMonster2)
        if (okClicked) showMonstersDetails(Some(selectedMonster2))

    } else {
        // Nothing selected.
        val alert = new Alert(Alert.AlertType.Warning){
          initOwner(MainApp.stage)
          title       = "No Selection"
          headerText  = "No monsters Selected"
          contentText = "Please select a monsters in the table."
        }.showAndWait()
      }
    }

我希望它能够访问第二个 table 即使 selectedMonster1 仍然是 != null

从你的问题中并不完全清楚你想做什么,所以请耐心等待...(为了将来参考,最好创建一个 ''minimal, complete and verifiable example'' 来说明你的问题。)

我假设您有两个 scalafx.scene.control.TableView 实例,通过 monstersTable1monstersTable2 引用。您想要允许用户 select 第一个 table 中的一个怪物,或者第二个 table 中的一个怪物,但不能 select 同时从每个 table 中抽取一个怪物。

我不清楚你的 handleEditMonster 函数是什么时候被调用的,所以我猜它是在用户点击时被调用的,比方说,一个 Edit Monster 按钮,作为该按钮的点击事件处理程序。

我说得对吗?

假设以上是准确的,你应该监听 table selection 的变化,并在新的 table 清除另一个 table 的 selection =31=]离子被制成。每个 table 中的当前 selected 项是一个 属性,我们可以向其添加侦听器,因此我们可以使用以下代码(在您的场景初始化中)实现此目的:

// In the onChange handlers, the first argument references the observable property
// that has been changed (in this case, the property identifying the currently
// selected item in the table), the second is the property's new value and the third
// is its previous value. We can ignore the first and the third arguments in this
// case. If the newValue is non-null (that is, if the user has made a
// selection from this table), then clear the current selection in the other
// table.
monstersTable1.selectionModel.selectedItem.onChange {(_, newValue, _) =>
  if(newValue ne null) monstersTable2.selectionModel.clearSelection()
}
monstersTable2.selectionModel.selectedItem.onChange {(_, newValue, _) =>
  if(newValue ne null) monstersTable1.selectionModel.clearSelection()
}

这应该可以解决问题,您的 handleEditMonster 功能现在应该可以使用了。您可能想要添加一个断言来防止两个 table 都具有当前 selection,这表明 selection 处理程序逻辑中存在错误。