Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    339

    Visualizzare oggetti ordinati in una JList

    Ciao.

    Ho il problema di visualizzare in una JList degli oggetti di tipo Articolo in modo Ordinato(in ordine alfabetico in base alla tipologia di Articolo).

    Questi oggetti sono contenuti in una TreeSet.

    Praticamente io aggiungo prima oggetti nella TreeSet e contemporaneamente in un DefaultListModel associato alla JList .

    Forse è proprio qui che sbaglio. Cioè vorrei che anche quando aggiungo L'oggetto Articolo nel DefaultListModel si mantenga l'ordinamento.

    Vi posto un pò di codice :

    Il DefaultListModel associato a JList:

    codice:
    private DefaultListModel JlistModel = new DefaultListModel();
    private JList jlistProdotti = new JList(JlistModel);

    La Classe Articolo implementa Comparable ed ha un metodo compareTo :

    codice:
    public class Articolo implements Serializable , Comparable<Articolo> {
        
    private String tipologia;
    private String marcaTipologia;
    private String modelloTipologia;
    private String caratteristicheArticolo;
    private int quantità;
    private int codiceArticolo;
    private double prezzo;
    codice:
    @Override
    public int compareTo(Articolo art) {
            
    return this.getTipologia().compareTo(art.getTipologia());
    }

    Una classe DepositoPrincipale costituita da una TreeSet :

    codice:
    public class DepositoArticoli{
        
    private TreeSet<Articolo> Deposito;
    private double capitaleDeposito;
        
        
    //
    public DepositoArticoli(){
        Deposito = new TreeSet<Articolo>();
        capitaleDeposito = 0.0;
            
    }// COSTRUTTORE DEPOSITO ARTICOLI
        
    public void aggiungi(Articolo a){
        Deposito.add(a);
    }
        
    public void rimuovi(Articolo a){
        Deposito.remove(a);
    }
    }

    Ecco come aggiungo gli oggetti Articolo:

    codice:
    DepositoPrincipale.aggiungi(articolo);
    JlistModel.addElement(articolo);
    Però nella JList non si visualizzano ordinati.
    Come devo fare l'aggiunta nel JlistModel?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,281
    Quote Originariamente inviata da Markus85 Visualizza il messaggio
    codice:
    DepositoPrincipale.aggiungi(articolo);
    JlistModel.addElement(articolo);
    Però nella JList non si visualizzano ordinati.
    Mi pare ovvio ... stai aggiungendo in DepositoPrincipale che è ordinato grazie al TreeSet ma lo stesso articolo lo stai aggiungendo separatamente anche nel list model. Dove non c'è di per sé alcun ordinamento implicito sui contenuti degli oggetti.

    O metti tutto nel TreeSet e poi vai a creare un ArrayList popolato dal TreeSet (quindi i dati sono già ordinati) e poi metti gli elementi del ArrayList nel list model.
    Oppure implementi un tuo ListModel che ha la logica per mantenere ordinati gli elementi.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    339
    Quote Originariamente inviata da andbin Visualizza il messaggio
    O metti tutto nel TreeSet e poi vai a creare un ArrayList popolato dal TreeSet (quindi i dati sono già ordinati) e poi metti gli elementi del ArrayList nel list model.
    Oppure implementi un tuo ListModel che ha la logica per mantenere ordinati gli elementi.
    Sarebbe più semplice , ma non posso riempire prima tutto il TreeSet e poi metteril tutto in ListModel.
    Ho bisogno che gli articoli che aggiungo si mantengano ordinati "in tempo reale" cioè ogni volta che aggiungo un oggetto articolo la JList si deve aggiornare.

    Implementando una mia classe ListModel posso arrivare a questo?

    Devo creare una mia classe ListModel che estende DefaultListModel e ci devo mettere un metodo comparatore giusto?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,281
    Quote Originariamente inviata da Markus85 Visualizza il messaggio
    Implementando una mia classe ListModel posso arrivare a questo?
    Sì, implementando un tuo list model, si può fare.

    Quote Originariamente inviata da Markus85 Visualizza il messaggio
    Devo creare una mia classe ListModel che estende DefaultListModel e ci devo mettere un metodo comparatore giusto?
    No. Crei una classe che estende AbstractListModel. All'interno crei/gestisci il tuo list (basta ArrayList) e implementi i 2 metodi basilari per ListModel che sono getSize e getElementAt.

    Poi definisci un tuo metodo extra, puoi chiamarlo, add, insert ... come vuoi che riceve l'elemento da inserire. In questo metodo devi inserire l'elemento all'indice "giusto" per mantenere ordinata la lista. Ti conviene usare il principio del "binary search" (vedi i metodi di utilità binarySearch di Collections).
    Dopo che hai inserito l'elemento all'indice giusto nel tuo list, devi chiaramente notificare la "view" usando fireIntervalAdded fornito da AbstractListModel.

    P.S. non ti conviene partire da DefaultListModel perché ha una API ben più corposa e diversi metodi che alterano il model. Potresti ridefinire addElement(E element) ma ..... add(int index, E element) ? O insertElementAt(E element, int index) ? Questi appunto non sono pensati per un list model mantenuto ordinato.

    EDIT: tra l'altro in DefaultListModel la variabile di istanza che tiene il Vector degli elementi è private. E non c'è un metodo che lo espone direttamente (c'è al massimo il toArray()). Quindi applicare il principio del binary search non sarebbe così banale. I binarySearch di Collections non sarebbero usabili (non hai accesso al Vector) e quindi dovresti implementarlo "a mano", scrivendo più codice (e dovresti conoscere molto bene il binary search).
    Ultima modifica di andbin; 17-03-2014 a 18:37
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    339
    mi è venuta un'altra idea.....

    e se mettessi il treeset come unico elemento della Jlist ?

    Cioè aggiungo un elemento nella treeset ,
    Poi aggiungo la treeset in JlistModel;
    Alle successive aggiunte di articoli , ripeto il passo 1 e poi sostituisco l'elemento di JlistModel con la nuova treeset .
    In pratica nel JlistModel rimane sempre un solo elemento costituito dalla treeset.

    L'unico problema e che non riesco a visualizzare gli elementi di treeset nella JList.

    Mi esce una cosa del tipo : [Deposito.DepositoArticoli@480a3d98f]

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,281
    Quote Originariamente inviata da Markus85 Visualizza il messaggio
    e se mettessi il treeset come unico elemento della Jlist ?

    Cioè aggiungo un elemento nella treeset ,
    Poi aggiungo la treeset in JlistModel;

    Alle successive aggiunte di articoli , ripeto il passo 1 e poi sostituisco l'elemento di JlistModel con la nuova treeset .
    In pratica nel JlistModel rimane sempre un solo elemento costituito dalla treeset.

    L'unico problema e che non riesco a visualizzare gli elementi di treeset nella JList.
    No, non può funzionare così (e non ha neanche senso).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    339
    Mi è stato suggerito di utilizzare una JTable , che dici? ; dovrebbe mantenere ordinati gli elementi da se mi pare. Posso associare ad essa una TreeSet o ha già di per se una struttura dati?

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,281
    Quote Originariamente inviata da Markus85 Visualizza il messaggio
    Mi è stato suggerito di utilizzare una JTable , che dici?
    Se ti è necessario visualizzare più dati incolonnati per ciascun "record", sì è appropriato.

    Quote Originariamente inviata da Markus85 Visualizza il messaggio
    dovrebbe mantenere ordinati gli elementi da se mi pare. Posso associare ad essa una TreeSet o ha già di per se una struttura dati?
    JTable di per sé non ha alcun ordinamento "predefinito". JTable si basa sui "table model" che semplicemente espongono i dati e le informazioni su di essi.

    I Set/Map non sono appropriati, non direttamente. Un table model può essere uno predefinito del framework (es. DefaultTableModel) oppure uno completamente custom. Ma in genere se ha una struttura dati interna, si basa su array o List.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    339
    Quote Originariamente inviata da andbin Visualizza il messaggio
    JTable di per sé non ha alcun ordinamento "predefinito". JTable si basa sui "table model" che semplicemente espongono i dati e le informazioni su di essi.
    Mi hanno informato male allora......comunque....
    Il mio obiettivo è di visualizzare su grafica gli elementi di una collezione secondo un ordine alfabetico.
    Elementi che devono essere salvati su disco per poi essere recuperati ad una successiva apertura del programmino
    Quali strumenti mi consigli per fare ciò?

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,281
    Quote Originariamente inviata da Markus85 Visualizza il messaggio
    Mi hanno informato male allora......comunque....
    Il mio obiettivo è di visualizzare su grafica gli elementi di una collezione secondo un ordine alfabetico.
    Elementi che devono essere salvati su disco per poi essere recuperati ad una successiva apertura del programmino
    Quali strumenti mi consigli per fare ciò?
    Se devi visualizzare una lista di oggetti, banalmente stringhe o comunque qualunque oggetto per cui toString() dia una stringa utile, allora JList è appropriato.
    JList non ha nulla, di per sé, per quanto riguarda l'ordinamento degli elementi, esso si basa esclusivamente su ciò che riceve da un ListModel. Un ListModel, a parte i metodi per gestire i listener, ha due metodi principali: getSize e getElementAt, ovvero "dimmi quanti elementi hai" e "dammi l'elemento i-esimo". Quindi qualunque tipo di ordinamento può essere imposto e gestito dentro un list model.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.