TornadoFX – 使用ContextMenu右键单击选项移除项目

所以我有一个表格视图,显示AccountsArrayList Account(name, login, pass) ,这些都是数据类。 当我右键单击一个单元格时弹出删除选项。 我想要做的是从observedArrayList删除该Account

只有我找不到办法做到这一点。 我没有JavaFX或TornadoFX的经验,我也无法找到答案谷歌或在TornadoFX指南和文档。

这是我的代码:

 class ToolView : View() { override val root = VBox() companion object handler { //val account1 = Account("Google", "martvdham@gmail.com", "kkk") //val account2 = Account("Google", "martvdham@gmail.com", "Password") var accounts = FXCollections.observableArrayList<Account>( ) var gson = GsonBuilder().setPrettyPrinting().create() val ggson = Gson() fun writeData(){ FileWriter("accounts.json").use { ggson.toJson(accounts, it) } } fun readData(){ accounts.clear() FileReader("accounts.json").use{ var account = gson.fromJson(it, Array<Account>::class.java) if(account == null){return} for(i in account){ accounts.add(i) } } } } init { readData() borderpane { center { tableview<Account>{ items = accounts column("Name", Account::name) column("Login", Account::login) column("Password", Account::password) contextMenu = ContextMenu().apply{ menuitem("Delete"){ selectedItem?.apply{// HERE IS WHERE THE ITEM DELETE CODE SHOULD BE} } } } } bottom{ button("Add account").setOnAction{ replaceWith(AddView::class, ViewTransition.SlideIn) } } } } } 

谢谢!

澄清@ Martacus的答案,在你的情况下,你只需要替换/ / // HERE IS WHERE THE ITEM DELETE CODE SHOULD BEaccounts.remove(this) ,你在做生意。

你也可以替换这一行

 selectedItem?.apply{ accounts.remove(this) } 

 selectedItem?.let{ accounts.remove(it) } 

根据我的经验,当你只是使用一个值而不是设置一个接收器的时候, letapply更普遍。


请注意,如果accounts列表是异步构建和复制的,则此过程将会不同,这是asyncItems { accounts }的默认行为。

selectedItem是您已选择/右键点击的项目。 然后你可以使用arraylist.remove(selectedItem)