Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123

    [Java] JTree ottenere elemento selezionato

    Ciao a tutti,

    Ho un albero che parte da una Radice di elementi, contiene dei nodi A e B, e dentro a questi nodi le foglie..vorrei sapere come posso prendere la foglia selezionata, e quindi generare un evento alla selezione della foglia!

    Grazie a tutti! ^^

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    andbin saprà dirti meglio, cmq inizia a guardare

    codice:
    TreePath[] paths = tree.getSelectionPaths();
    guarda qui io ci ho trovato una marea di esempi validi
    http://www.java2s.com/Code/Java/Swin...eComponent.htm

    http://www.apl.jhu.edu/~hall/java/Sw...ial-JTree.html

    e ovviamente le api (che sai come trovare).

    Il punto è andare a riprendere path (dalla radice ai figli) del selezionato.
    Stai attento se il nodo non è espanso (non è detto che ricerchi all'interno)

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Grazie, il secondo link mi è stato d'aiuto

    Forse è meglio se spiego un pò il mio problema, così forse è più semplice aiutarmi^^

    Al click sulla foglia devo mostrare dei dati, quindi mi serve il nome della foglia per sapere a che posizione dell'array andare a prendere la persona in questione (e logicamente, ogni foglia raggruppa dei dati sulla persona, quindi, in base al nodo ho la persona, ed in base alla foglia ho il dato).
    Il mio problema è proprio questo..ottenere gli indici sarebbe molto meglio, sia del nodo che della foglia..

    Grazie a tutti! ^^

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    ehhh ma allora visto che nel nodo puoi mettere un qualsiasi object, metti la persona come nodo (che si porta dietro le sue robe) e fai l'override di toString() non so se mi sono spiegata

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Originariamente inviato da valia
    ehhh ma allora visto che nel nodo puoi mettere un qualsiasi object, metti la persona come nodo (che si porta dietro le sue robe) e fai l'override di toString() non so se mi sono spiegata
    Si esattamente!
    Però vedi, all'interno della persona ci stanno le fatture..ed ogni fattura ha dei dati separati, quindi cliccando su questa devo mostrare i dati ivi contenuti.

    L'oggetto persona contiene appunto le fatture di questa persona, e cliccando su una fattura (foglia) ottengo quindi l'indice.

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Sono diverse le soluzioni:

    1. buttare la fattura sul nodo, ma per controlli hai il bruttissimo instanceof persona o instanceof fattura per il cast
    2. creare un punto base da cui derivare Nodo --> ha un oggetto persona e uno fattura, uno a null e uno valido in modo tale che il tostring lo fai del valido

    in questo modo, scegliendo un nodo no fai altro che aggiungere di nodi figli al tuo nodo (e nei vari esempi c'ìè come fare): i dati li hai, devi solo creare gli oggetti e fare il render a video.
    Altre idee non ho (perdona sempre l'ora)

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Ciao, ti ringrazio per la risposta!

    Bhe io avrei pensato ad un altra cosa...ma penso sia troppo dispendiosa, comunque:

    Ho un elenco di persone in un LinkedList. Ogni persona ha un un elenco di fatture, ed ogni fattura è distinta da una data e contiene un array di descrizioni (ad ogni fattura viene aggiunta la prestazione o le prestazioni con il relativo importo).

    Al click, avrei pensato di scorrere quindi l'elenco di persone, ottenere l'elemento dell'albero clickato e controllare se presenta uno spazio nel mezzo (questo perchè come Nodo ho il paziente indicato da nome e cognome), quindi, estraggo la persona dall'elenco, ed al click su uno delle foglie mostrare i dati relativi, salvati nell'oggetto fatture e nella posizione specificata dalla data.

    è evidente che lo spreco di risorse è tutt'altro che minimo..ed in più si aggiunge un problema del quale ho tenuto conto precedentemente: le persone le distinguo da un ID, visto che posso avere 2 persone con lo stesso nome. Se faccio una ricerca per "Mario Rossi" ed ho 2 Mario Rossi nel database e quindi li inserisco nell'albero, quando clicco su un Mario Rossi nel nodo..come faccio sapere quale ho selezionato?

    Oppure potrei scegliere un approcio differente..mostrando in un altro modo l'elenco di persone e fatture.

    Grazie! ^^

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Originariamente inviato da Patrick Jane
    ed in più si aggiunge un problema del quale ho tenuto conto precedentemente: le persone le distinguo da un ID, visto che posso avere 2 persone con lo stesso nome. Se faccio una ricerca per "Mario Rossi" ed ho 2 Mario Rossi nel database e quindi li inserisco nell'albero, quando clicco su un Mario Rossi nel nodo..come faccio sapere quale ho selezionato?
    Non ho capito tutto tutto, però ti dico subito come risolvere qualche problemino. Non è bellissima come soluzione, ma potrebbe fare al caso tuo.
    Tu crea la tua classe Node che estende DefaultMutableTreeNode.
    Qui dentro puoi buttare ad esempio diverse info, potresti mettere un oggetto di tipo Persona e uno di tipo Fattura, null come default.

    Quando crei un nodo Persona, crei un'istanza di questo tipo con un costruttore simile
    codice:
    MyNode node = new MyNode (persona);
    MyNode node = new MyNode (fattura);
    fai l'override dei vari metodi, soprattutto di toString() in modo da avere un messaggio che dice nome nel caso di persona, fattura quello che ti pare.

    ( http://www.apl.jhu.edu/~hall/java/Sw...Tutorial-JTree guarda outilinenode, caso 4).

    A questo punto ogni volta che hai un nodo, dal treePath anzichè prendere un DefaultMutableTreeNode prendi un MyNode e a seconda di chi non è null hai l'intero oggetto.

    Per risparmiare risorse, ti consiglio di fare una copia "leggera" dell'oggetto (nel senso valorizza solo i dati del mex, dell'ID per persona, dati principali o chiavi per fattura), ma in linea di principio funziona (già fatto).
    Potresti fare una Node di base da cui derivi NodePersona e NodeFattura, ma fai controlli di tipo inutili (non necessari).

    Scorrere la struttura, hai il getSelectedTreePath e hai il path di tutti i selezionati (attenzione ai casi di nodo chiuso).
    non so se questo allegerisce i tuoi problemi.


    Approccio differente quale??

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Come altra soluzione intendevo qualcos'altro....mostrare i dati in un altro modo!

    Comunque, la tua soluzione mi piace, non so perchè non ci ho pensato prima
    Ma ho alcune domandine^^

    1) Sono costretto a ridefinire ogni metodi di quella classe? (e richiamare con super il metodo della superclasse)
    2) Non sarebbe meglio un costruttore che riceve un parametro Persona e far in modo che le fatture vengano aggiunte all'oggetto Persona?

    Grazie! ^^

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    no, perché un comportamento di default ce l'hanno, però la ridefinizione viene dall'uso che ne fai...è molto probabile che se è una fattura è sicuro che sia solo una foglia, altrimenti no, quindi la ridefinizione ti può risparmiare controlli (spesso ricorsivi).

    Si ma queste fatture come le visualizzi? Le fatture devi mapparle su un oggetto Node, quindi ti resta il problema del rendering a video della fattura. IN quel modo hai sempre e cmq un tot di oggetti Node, ognuno autodescrittivo.

    Dicevo io copia leggera per mantenere in ogni persona solo gli indici, magari in un hashmap, per poter caricare in modo rapido i figli (pensa che quando non li visualizzi no li carichi, no?)

    riguardo al costruttore non ricordo, ma una chiamata a super con lo stesso parametro tendo a farla sempre esplicitamente (per essere sicura che inizializzi anche le robe della super classe), anche se logica vuole che cmq il costruttore del super viene chiamato.
    E' una garanzia che vada dove dico io.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.