Java: getRowForLocation() mengembalikan int baris yang berbeda ketika Jtree telah memperluas node atau menciutkan node

JTree jtree memiliki pendengar mouse yang terpasang padanya. ketika pengguna mengklik node komponen Jtree, saya mendapatkan integer barisnya melalui

 jtree.getRowForLocation(evt.getX(), evt.getY());

masalahnya adalah integer baris kembali berbeda ketika ada node jtree yang diperluas dan ketika diciutkan.

Saya memerlukan cara untuk mendapatkan ID unik dan absolut dari setiap node jtree yang diklik sehingga tidak ada kebingungan.

Apakah ada cara untuk menambahkan data ke komponen Jtree?

Jika tidak, saya memerlukan cara untuk mendengarkan kapan node diperluas dan menghitung ulang baris yang dikembalikan dari fungsi di atas....


person KJW    schedule 28.05.2011    source sumber


Jawaban (2)


Dalam pendekatan Anda saat ini, Anda mengandalkan keadaan tampilan pohon untuk mengidentifikasi simpul. Namun, seperti yang Anda ketahui, keadaan tampilan dapat berubah. Yang tidak berubah adalah model pohon yang mendasari tampilan tersebut.

Jika Anda memerlukan ID unik untuk setiap node maka Anda harus menambahkannya langsung ke setiap node pohon di model pohon Anda. Di pendengar mouse Anda kemudian dapat mendeteksi node yang Anda klik dan mengakses ID uniknya.

person Mark    schedule 28.05.2011
comment
bagaimana saya bisa langsung menambahkan ID unik langsung ke setiap simpul pohon? Node pohon itu sendiri dihasilkan dari file xml tempat model pohon dihasilkan. Model pohon ini kemudian dirender menjadi Jtree. - person KJW; 29.05.2011
comment
Bisakah Anda menambahkan ID unik ke file XML sumber? Atau setelah model pohon dibuat, dapatkah Anda menjalankannya dan menetapkan ID unik pada setiap node? - person Mark; 29.05.2011
comment
Saya telah menambahkan ID unik ke file xml sumber. maksud Anda menambahkan pendengar model ke model pohon? - person KJW; 29.05.2011
comment
Satu pertanyaan terakhir adalah, apakah mungkin mengubah model pohon menjadi file xml? - person KJW; 29.05.2011

Jalur secara unik mengidentifikasi node, jadi getPathForLocation akan memberi Anda jalurnya, tetapi itu adalah objek TreePath, jadi jika Anda harus memiliki bilangan bulat yang mewakili ID, Anda perlu menulis metode yang menerjemahkan TreePaths menjadi bilangan bulat.

person trutheality    schedule 28.05.2011
comment
maksud Anda mengambil jalur pohon dan membuat ID unik dari itu? - person KJW; 29.05.2011
comment
Ya, jika Anda benar-benar membutuhkan ID integer. Namun karena Anda mendapatkan akses langsung ke elemen pohon dengan TreePath.getLastPathComponent(), Anda mungkin tidak perlu menggunakan ID, bergantung pada apa yang ingin Anda lakukan dengan node tersebut. - person trutheality; 29.05.2011
comment
Saya menggunakan findComponentAt(x,y) untuk menemukan komponen....apa ID uniknya? maksud Anda properti flags dari komponen node jtree? - person KJW; 29.05.2011
comment
Kode hash tidak dijamin unik -- hanya dirancang agar sangat kecil kemungkinannya sama untuk objek yang berbeda. Solusi yang aman adalah dengan menelusuri pohon dan memberikan nomor pada setiap elemen (baik dengan mengedit komponen atau dengan menggunakan beberapa struktur data pembantu seperti peta). - person trutheality; 29.05.2011