尝试在scalafx中获得用户最新的鼠标单击

时间:2019-06-19 06:01:00

标签: scala mouseevent scalafx

我试图获得用户最新的鼠标单击以显示正确的表格。但是,我找不到实现此想法的任何方法。如何使用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()
      }
    }

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

1 个答案:

答案 0 :(得分:1)

从您的问题中尚不清楚您要做什么,所以请您忍受...(以供将来参考,最好创建一个''minimal, complete and verifiable example''来说明您的问题。 )

我假设您有两个scalafx.scene.control.TableView实例,分别通过monstersTable1monstersTable2引用。您希望允许用户选择第一个表中的一个怪物,或第二个表中的一个怪物,但不能同时从每个表中选择一个怪物。

我不清楚何时调用您的handleEditMonster函数,因此我猜测用户单击例如 Edit Monster 按钮时会调用该函数,因为该按钮的clicked事件处理程序。

我有那个权利吗?

假设以上内容正确无误,则应侦听表选择中的更改,并在做出新选择时清除另一个表中的选择。每个表中当前选定的项目都是一个属性,我们可以向其添加一个侦听器,因此我们可以使用以下代码(在场景的初始化中)实现此目的:

// 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函数现在应该可以工作了。您可能想要添加一个断言以防止两个表都具有当前选择,这将表明选择处理程序逻辑中存在错误。