0

observedArrayListしたがって、 Accountsを表示するテーブル ビューがありますAccount(name, login, pass)。これらはデータ クラスです。セルを右クリックすると、削除のオプションが表示されます。私がしたいAccountのは、それをobservedArrayList

私だけがこれを行う方法を見つけることができません。私はJavaFXまたはTornadoFXの経験がなく、Googleまたは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)
                }
            }
        }
    }
}

ありがとう!

4

2 に答える 2

2

@Martacusの答えを明確にするために、あなたの場合、置き換えるだけ// HERE IS WHERE THE ITEM DELETE CODE SHOULD BEで済みaccounts.remove(this)、あなたはビジネスをしています。

行を置き換えることもできます

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

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

私の経験からすると、レシーバーを設定する代わりに値を使用する場合letよりも一般的です。apply


accountsリストが非同期で作成されてコピーされる場合、プロセスは異なることに注意してください。これは のデフォルトの動作ですasyncItems { accounts }

于 2016-08-08T16:13:54.977 に答える
1

selectedItem選択/右クリックした項目です。次に、使用できますarraylist.remove(selectedItem)

于 2016-08-08T10:14:57.177 に答える