Jframe jtable

di il
230 risposte

230 Risposte - Pagina 8

  • Re: Jframe jtable

    No, come dici tu avere tre liste diverse non ha molto senso. Perlomeno non se hanno veicoli in comune. Se tu volessi O mostrare le auto O mostrare le moto, allora potrebbe avrebbe senso avere due liste e due modelli distinti (anche diversi se a quel punto vuoi specializzare le colonne in base al tipo), e aggiornare il modello della tabella al volo quando cambi tipo di veicolo.

    Se vuoi invece mostrare anche entrambi i veicoli assieme no, anche perché dovresti sincronizzare le liste se dovessero subire delle modifiche, ma proprio a livello concettuale non ci sta.

    Anche mantenere i veicoli in eccesso non ha granché senso, perché non il contrario al limite?

    Ho modificato il post di prima senza aggiungere un edit, sei stato veloce a rispondere, mi cito:

    Ansharja ha scritto:


    Tra l'altro se vuoi partire da mostrare solo un certo numero di veicoli, anche se la tabella ne avrebbe di più (senza rimuoverli quindi), la cosa non è molto complicata, sarebbe molto più difficile dover "nascondere" delle righe in mezzo, tu cosa faresti?
  • Re: Jframe jtable

    Si bhe succede spesso che scrivendo qua e cercando di spiegare quello che ho fatto e perché, succede che a volte mi viene l'illuminazione.
    difatti ho notato che nel listener ho chiamato direttamente i metodi add/removeRow, mentre dovevo fare atb.add/removeRow.
    poi mi son ricordato che non posso modificare elementi come la lista nell'abstracttablemodel quindi il metodo va un attimino rivisto

    EDIT:
    l'impostazione del codice va bene, per quanto riguarda la parte del listener dico
    forse mi son un po' incasinato, ma l'idea dovrebbe essere giusta no?
  • Re: Jframe jtable

    KuroKami69 ha scritto:


    Intanto ho fatto queste righe, potreste per cortesia dirmi se son giuste o se faccio prima a buttarmi dal balcone? ahahaha

    table model:
    
    
       public void removeRow(int rowIndex)
       {
          automobili.remove(rowIndex);
          fireTableRowsDeleted(rowIndex, rowIndex);
          fireTableChanged(TableModelEvent e);
       }
       
       public void addRow(int rowIndex)
       {
          for (automobili.size <= rowIndex)
          automobili.add(rawIndex);
          fireTableRowsInserted(rowIndex, rowIndex);
          fireTableChanged(TableModelEvent e);
       }
       
    
    fireTableChanged(TableModelEvent e) scritto così no, è più simile alla dichiarazione di un metodo che non a una chiamata. Cerca più esempi online dell'uso di questi metodi, se gli esempi di prima non bastavano (non mi ricordo ora, ma comunque cerca, cerca, cerca sia sulla documentazione sia nei tutorial e negli esempi online).

    Il removeRow andrebbe anche bene, semmai uno potrebbe chiedersi come fa un utente a specificare l'indice della riga da rimuovere, ma se lo prevedi ok.

    Il addRow () invece non ha senso. Per il for innanzitutto, cosa volevi fare? Ma poi perché devi passare un indice al metodo? Al massimo passerai un'automobile che aggiugi alla lista no? Non puoi aggiungere un intero. O scegli anche la posizione in cui mettere una nuova automobile creata al volo? Non mi sembra una grande idea, ma in generale io non aggiungerei mai elementi creati così, non ne vedo proprio l'utilità.

    KuroKami69 ha scritto:



    listener:
    
    SpinnerModel jsm = new SpinnerNumberModel(10, 0, 1000, 5);
          final JSpinner js = new JSpinner(jsm);
          JButton b = new JButton("Visualizza");
          b.addActionListener(new ActionListener()
          {
             public void actionPerformed(ActionEvent e)
             {
                Integer i = (Integer)js.getValue(); //al primo avvio questo valore sarà 10, di default
                int s = 10; //valore iniziale spinner, dopo andrà ad assumere il valore dello spinner
                if (i < s)
                {
                   int n = s - i;
                   removeRow(n);
                   s = (Integer)js.getValue();
                }
                else if (i > s)
                {
                   int n = i - s;
                   addRow(n);
                   s = (Integer)js.getValue();
                }
                else
                addRow(i);
             }
          });
    No, quell'int s non ha senso. Se vuoi che sia pari al numero di righe delle tabella, non puoi dichiararlo pari a 10, devi prendere il numero di righe della tabella! Anche quell'if/else non ci sta: a parte che come detto non vedo l'utilità di aggiungere le righe alla tabella, ma comunque s è locale al metodo, quindi non ha senso assegnarli il valore dello spinner prima di uscire dal metodo. Ma non devi comunque ragionare in termini di numero di righe che pensi ci sia dopo una modifica, non puoi controllare tutto da lì e dire "Ok se prima erano dieci e ne ho aggiunte cinque so che saranno quindici alla prossima volta che entro qui". Chi te lo dice? E se il modello lo modifica qualcun'altro?
  • Re: Jframe jtable

    Ansharja ha scritto:


    KuroKami69 ha scritto:


    Intanto ho fatto queste righe, potreste per cortesia dirmi se son giuste o se faccio prima a buttarmi dal balcone? ahahaha

    table model:
    
    
       public void removeRow(int rowIndex)
       {
          automobili.remove(rowIndex);
          fireTableRowsDeleted(rowIndex, rowIndex);
          fireTableChanged(TableModelEvent e);
       }
       
       public void addRow(int rowIndex)
       {
          for (automobili.size <= rowIndex)
          automobili.add(rawIndex);
          fireTableRowsInserted(rowIndex, rowIndex);
          fireTableChanged(TableModelEvent e);
       }
       
    
    fireTableChanged(TableModelEvent e) scritto così no, è più simile alla dichiarazione di un metodo che non a una chiamata. Cerca più esempi online dell'uso di questi metodi, se gli esempi di prima non bastavano (non mi ricordo ora, ma comunque cerca, cerca, cerca sia sulla documentazione sia nei tutorial e negli esempi online).

    Il removeRow andrebbe anche bene, semmai uno potrebbe chiedersi come fa un utente a specificare l'indice della riga da rimuovere, ma se lo prevedi ok.

    Il addRow () invece non ha senso. Per il for innanzitutto, cosa volevi fare? Ma poi perché devi passare un indice al metodo? Al massimo passerai un'automobile che aggiugi alla lista no? Non puoi aggiungere un intero. O scegli anche la posizione in cui mettere una nuova automobile creata al volo? Non mi sembra una grande idea, ma in generale io non aggiungerei mai elementi creati così, non ne vedo proprio l'utilità.
    effettivamente ho interpretato male il funzionamento generale.
    ho visto un esempio l'ho copiato adattandolo ma non ci ho ragionato su ed è uscita una schifezza.
    bhe anzitutto non voglio modificare la lista nel tablemodel quindi ho tolto il for, che metto nel, ora il tablemodel ha solo
    
    public void removeRow(int rowIndex)
    	{
    		fireTableRowsDeleted(rowIndex, rowIndex);
    		fireTableChanged(TableModelEvent e);
    	}
    	
    	public void addRow(int rowIndex)
    	{
    		fireTableRowsInserted(rowIndex, rowIndex);
    		fireTableChanged(TableModelEvent e);
    	}
    
    che onestamente non ho ancora capito bene come funzionano. il changed almeno.
    il delete semplicemente gli passo 2 valori, e lui mi toglie le righe dal primo valore dichiarato, quindi può essere 5, fino all'ultimo, che può essere 10, lasciandomi così solo 4 righe nella tabella. giusto no? l'insert è uguale solo che aggiunge anziché togliere, quindi io nei miei 2 metodi devo prevedere 2 parametri in ingresso. dovrebbe essere giusto il ragionamento, hmm (e ora piovono sberle)

    Ansharja ha scritto:


    KuroKami69 ha scritto:



    listener:
    
    SpinnerModel jsm = new SpinnerNumberModel(10, 0, 1000, 5);
          final JSpinner js = new JSpinner(jsm);
          JButton b = new JButton("Visualizza");
          b.addActionListener(new ActionListener()
          {
             public void actionPerformed(ActionEvent e)
             {
                Integer i = (Integer)js.getValue(); //al primo avvio questo valore sarà 10, di default
                int s = 10; //valore iniziale spinner, dopo andrà ad assumere il valore dello spinner
                if (i < s)
                {
                   int n = s - i;
                   removeRow(n);
                   s = (Integer)js.getValue();
                }
                else if (i > s)
                {
                   int n = i - s;
                   addRow(n);
                   s = (Integer)js.getValue();
                }
                else
                addRow(i);
             }
          });
    No, quell'int s non ha senso. Se vuoi che sia pari al numero di righe delle tabella, non puoi dichiararlo pari a 10, devi prendere il numero di righe della tabella! Anche quell'if/else non ci sta: a parte che come detto non vedo l'utilità di aggiungere le righe alla tabella, ma comunque s è locale al metodo, quindi non ha senso assegnarli il valore dello spinner prima di uscire dal metodo. Ma non devi comunque ragionare in termini di numero di righe che pensi ci sia dopo una modifica, non puoi controllare tutto da lì e dire "Ok se prima erano dieci e ne ho aggiunte cinque so che saranno quindici alla prossima volta che entro qui". Chi te lo dice? E se il modello lo modifica qualcun'altro?
    io il funzionamento nello spinner l'ho visto così:
    1) il valore di default è 10, che ho assegnato a s, quindi dato che la mia tabella all'inizio non ha valori, nell'else gli ho detto "hey, se il valore dello spinner è uguale a quello di s, allora mi popoli la tabella.
    2) devo avere un numero n di righe da rimuovere giusto? quindi ho pensato. la mia situazione iniziale sarà lo spinner a 10, che assegno a s. da questa situazione iniziale, se il nuovo valore dello spinner è inferiore a 10 (il valore di partenza, di default), allora mi assegni a n il risultato della sottrazione s(valore iniziale) - i(valore attuale dello spinner) e questo valore lo passo al metodo che rimuove le righe. dopodiché dato che ora lo spinner avrà un nuovo valore, per poter rifare questo "gioco", allora s non dovrà più essere 10 ma il valore dello spinner allo stato attuale
    3) come il punto 2. solo che controlla che s sia minore del valore attuale dello spinner. fa una sottrazione tra i e s e assegna il risultato a n che viene passato al metodo addrow. e riassegna ad s il valore attuale dello spinner.
    fatto così posso gestire i cambi di valore dello spinner. magari sarà un ragionamento di uno alle prime armi, proprio base base eh, ma non conosco altri metodi, quindi mi son ingegnato

    per l'utilità di aggiungere righe alla tabella... bhe se l'utente prima vuole vedere 10 mezzi, e poi ne vuole vedere 30, dovrò dire alla tabella di aggiungere le righe mancanti? oppure basta semplicemente che credo gli oggetti nella lista e poi si arrangia il tablemodel?
    cioè mettiamola più terra-terra.
    se voglio cambiare il numero di veicoli visualizzati, a seconda di quanti ne sceglie l'utente, ora son entrato nel pallone
    strada 1) serve l'add/removeRow?
    strada 2) basta che aggiungo/rimuovo oggetti alla mia lista e dopo tablemodel si arrangia a sistemare tutto?
    da come avevo capito io si doveva fare nel primo modo
  • Re: Jframe jtable

    KuroKami69 ha scritto:


    [...]
    Beh anzitutto non voglio modificare la lista nel tablemodel quindi ho tolto il for, che metto nel, ora il tablemodel ha solo
    
    public void removeRow(int rowIndex)
    	{
    		fireTableRowsDeleted(rowIndex, rowIndex);
    		fireTableChanged(TableModelEvent e);
    	}
    	
    	public void addRow(int rowIndex)
    	{
    		fireTableRowsInserted(rowIndex, rowIndex);
    		fireTableChanged(TableModelEvent e);
    	}
    
    che onestamente non ho ancora capito bene come funzionano. il changed almeno.
    il delete semplicemente gli passo 2 valori, e lui mi toglie le righe dal primo valore dichiarato, quindi può essere 5, fino all'ultimo, che può essere 10, lasciandomi così solo 4 righe nella tabella. giusto no? l'insert è uguale solo che aggiunge anziché togliere, quindi io nei miei 2 metodi devo prevedere 2 parametri in ingresso. dovrebbe essere giusto il ragionamento, hmm (e ora piovono sberle).
    L'unica cosa che hai indovinato è il "ora piovono sberle"

    Te lo continuiamo a dire, ma tu continui a non farlo, finché non studi non vai da nessuna parte. Io capisco benissimo che tu voglia scrivere codice, e infatti (anche se to consiglierei molto) non pretendo affatto che tu ti metta sui libri, ma NON PUOI non avere idea di cosa faccia un metodo e non andare a vedere sulla documentazione. O vai avanti a tentoni senza sapere cosa stai facendo. Dal link che ti ho fornito:
    public void fireTableRowsDeleted(int firstRow, int lastRow)

    Notifies all listeners that rows in the range [firstRow, lastRow], inclusive, have been deleted.
    Non sta dicendo che le righe vengono eliminate. I listener sono notificati del fatto che le righe nel range [...] sono state eliminate. Sono due cose molto diverse. Il fire serve a dire "Hey tabella (e altri listeners), delle righe sono state eliminate, cosa volete fare?".

    Il fireTableChanged non lo puoi chiamare così, devi passare un parametro di tipo TableModelEvent, ma non penso sia nemmeno necessario vista l'istruzione prima, dovrei verificare per essere sicuro.

    Quindi in pratica i metodi che hai scritto, anche se compilassero, non farebbero comunque nulla. Ma poi cosa vuol dire "non voglio modificare la lista nel tablemodel"? E' quello che devono fare i metodi! Aggiungere un oggetto Automobile alla tabella o rimuoverne uno. Mi sa che non è ancora chiaro cosa vuoi fare, se vuoi solo mostrare più/meno risultati non è così che devi fare, e ne abbiamo già parlato.

    KuroKami69 ha scritto:



    Io il funzionamento nello spinner l'ho visto così:
    1) il valore di default è 10, che ho assegnato a s, quindi dato che la mia tabella all'inizio non ha valori, nell'else gli ho detto "hey, se il valore dello spinner è uguale a quello di s, allora mi popoli la tabella.
    2) devo avere un numero n di righe da rimuovere giusto? quindi ho pensato. la mia situazione iniziale sarà lo spinner a 10, che assegno a s. da questa situazione iniziale, se il nuovo valore dello spinner è inferiore a 10 (il valore di partenza, di default), allora mi assegni a n il risultato della sottrazione s(valore iniziale) - i(valore attuale dello spinner) e questo valore lo passo al metodo che rimuove le righe. dopodiché dato che ora lo spinner avrà un nuovo valore, per poter rifare questo "gioco", allora s non dovrà più essere 10 ma il valore dello spinner allo stato attuale
    3) come il punto 2. solo che controlla che s sia minore del valore attuale dello spinner. fa una sottrazione tra i e s e assegna il risultato a n che viene passato al metodo addrow. e riassegna ad s il valore attuale dello spinner.
    fatto così posso gestire i cambi di valore dello spinner. magari sarà un ragionamento di uno alle prime armi, proprio base base eh, ma non conosco altri metodi, quindi mi son ingegnato
    Ma non è così che devi fare.

    Da quello che stai facendo sembra che tu voglia che lo spinner mostri il numero di righe che contiene la tabella all'interno, non quelle che vengono mostrate. Quindi se l'utente aumenta il numero dallo spinner aggiungi righe, altrimenti le togli.

    Questo non ha granché senso, hai mai visto qualcosa che funzioni così (lascia stare un tool che permetta di creare componenti grafici, non è quello che stai facendo)? Quale utente quando vede uno spinner si aspetta di creare nuove auto (passando quali valori?) o di cancellarne altre?

    Se vuoi fornire questa funzionalità allora crea un pulsante AggiungiAutomobile, o come vuoi chiamarlo, e apri una finestrella che permetta all'utente di inserire i dati e un bottone per confermare l'inserimento. Vuoi mettere un pulsante che crei un auto senza alcun valore, usando dei valori di default (ma quali sarebbero?) o che li crei a caso (non so perché ti piaccia questa parte, ma ok) o che li imposti inizialmente vuoti?
    Puoi anche farlo, ma deve essere chiaro quello stai facendo, chi usa l'applicazione non è un indovino.

    Uno spinner, o un componente per scegliere un numero fa pensare all'utente che possa mostare solo un certo numero di risultati della tabella, è così in un sacco di siti/applicazioni dove hai l'opzione "Mostra risultati".

    Comunque, a parte gli aspetti di design (se non sei d'accordo se ne può parlare eh ), facciamo finta che tu abbia deciso di sincronizzare lo spinner con il numero di righe delle tabella. Come lo stai facendo non va comunque bene.

    A parte il fatto che quell'intero s è dichiarato locale nell'actionPerformed e cessa di essere fuori, quindi il modificarlo alla fine non va bene.
    Tu devi semplicemente prendere il numero di righe che ha attualmente la tabella (getRowCount ()), prendere il valore dello spinner, e agire di conseguenza aggiungendo/rimuovendo righe.

    Non puoi salvarti il numero di volta in volta in una tua variabile (che comunque dovrebbe essere memorizzata a livello di classe), non hai il controllo di chi possa modificare il modello, se viene cambiato in un altro punto hai dati sbagliati. Quindi controlla sempre il numero di righe.

    Altra cosa: non puoi passare al TableModel un intero. Cosa se ne fa? Lo aggiunge alla lista di Automobili? No.
    Crea delle automobili al volo per aggiungerle alla lista? E cosa ne sa il table model delle auto che vanno aggiunte? Con che parametri le crea?

    Non è sua responsabilità. Il TableModel deve ricevere un oggetto Automobile da aggiungere alla sua lista interna. Se vuoi aggiungere 10 righe alla tabella perché l'utente ha scritto 15 e al momento ce ne sono 5, ok, crea 10 oggetti Automobile e passali al tablemodel che li aggiunga. Con che parametri? Non è certo il modello a curarsene, lui deve solo prendere un auto e aggiungerla.

    KuroKami69 ha scritto:


    Per l'utilità di aggiungere righe alla tabella... bhe se l'utente prima vuole vedere 10 mezzi, e poi ne vuole vedere 30, dovrò dire alla tabella di aggiungere le righe mancanti? oppure basta semplicemente che credo gli oggetti nella lista e poi si arrangia il tablemodel?
    cioè mettiamola più terra-terra.
    se voglio cambiare il numero di veicoli visualizzati, a seconda di quanti ne sceglie l'utente, ora son entrato nel pallone
    strada 1) serve l'add/removeRow?
    strada 2) basta che aggiungo/rimuovo oggetti alla mia lista e dopo tablemodel si arrangia a sistemare tutto?
    da come avevo capito io si doveva fare nel primo modo
    Ho già risposto in gran parte.
    Dal mio modo di vedere le cose se prima ci sono 10 mezzi e poi ne vuole vedere 30, o i mezzi ci sono e li mostri o mostri quanti ce ne sono. Io non aggiungerei righe così, o lo farei in altro modo, l'ho già detto sopra.

    Se invece ci sono molti mezzi e l'utente ne vuole vedere meno ottimo, basta mostrare meno righe, quasi nessuno si aspetta di eliminare gli oggetti dalla tabella in questo modo.
    Come dicevo prima, non è difficile mostrare meno righe. Chi è che sta dicendo alla tabella quante righe mostrare?
  • Re: Jframe jtable

    Ok ammetto di essere un po' demoralizzato. l'ho capito che devo studiare, che posso prendere e iniziare a vedere queste cose senza prima delle basi? no, non credo sia fattibile, almeno per me, e per arrivare a questo punto con lo studio, ci metterei un sacco di tempo e io questo esercizio lo voglio chiudere il prima possibile, sbattendo la testa più e più volte. per questo esercizio mi va bene così. alla fine ne esce comunque che qualcosa, si spera, ho capito.
    quindi a livello di design per farla tutta molto più semplice, mi conviene filtrare i risultati. bene procederò così allora e tagliamo la testa al toro.
    onestamente non ho la benché minima idea di come gestire il valore dello spinner, quindi ho tirato fuori quell'obrobrio per provare a gestirlo.
    non ho capito la tua ultima domanda.
    è retorica?
  • Re: Jframe jtable

    KuroKami69 ha scritto:


    Ok ammetto di essere un po' demoralizzato. l'ho capito che devo studiare, che posso prendere e iniziare a vedere queste cose senza prima delle basi? no, non credo sia fattibile, almeno per me, e per arrivare a questo punto con lo studio, ci metterei un sacco di tempo e io questo esercizio lo voglio chiudere il prima possibile, sbattendo la testa più e più volte. per questo esercizio mi va bene così. alla fine ne esce comunque che qualcosa, si spera, ho capito.
    quindi a livello di design per farla tutta molto più semplice, mi conviene filtrare i risultati. bene procederò così allora e tagliamo la testa al toro.
    onestamente non ho la benché minima idea di come gestire il valore dello spinner, quindi ho tirato fuori quell'obrobrio per provare a gestirlo.
    non ho capito la tua ultima domanda.
    è retorica?
    Ma non serve a nulla demoralizzarsi, e non ti sto dicendo che non devi finire l'esercizio, o farne altri mentre studi.

    Ma ci vogliono 3 minuti in croce a cercare nella documentazione cosa fa un certo metodo. Quello deve essere il punto di partenza se non hai capito qualcosa, è molto più veloce rispetto a scrivere codice senza capirlo. Poi sicuramente ci vuole più tempo a leggere i tutorial, cercare esempi, leggere risposte date in questo e in altri forum, ma anche su questo vale la pena perderci tempo, anche questo è "studio", a tutti gli effetti, e impari anche con un approccio più pratico.

    Ora come ora mi verrebbe da dirti: prova a implementare entrambe le soluzioni, anche se una secondo me non ha molto senso è comunque un esercizio.
    Dentro lo spinner sai già come prendere il valore, lo stai facendo.

    Se quel numero lo usi per filtrare i risultati allora potresti passare quel valore al table model, con un metodo es. setMaxRisultati (int valoreLettoDalloSpinner) per intenderci. Quindi il table model avrà al suo interno una variabile maxRisultati. Ora, cosa ci farà con quella variabile?

    La domanda che ho fatto non è retorica, ti sto suggerendo la soluzione. Chi sta dicendo alla tabella quante righe mostrare? O meglio, a chi è che lo sta chiedendo la tabella. Lo sai già in realtà. Quindi come potresti fare a dire "mostrami al massimo n righe"?

    Se quel numero invece lo usi per creare/rimuovere righe dalla tabella in modo da allinearti con il numero dello spinner non devi far altro che controllare il numero di righe che ha la tabella (sai già come fare, ne abbiamo già parlato), vedere quante dovrebbero essere secondo lo spinner, e aggiungere/rimuovere auto in corrispondenza. Ricorda che al momento il table model è perfettamente allineato con la lista di automobili, quindi rimuovere un'automobile corrisponde a rimuovere una riga (ovviamente dopo aver notificato la modifica, altrimenti non la vedi). Idem per l'aggiunta.
  • Re: Jframe jtable

    Ma vedi, il fatto che nonostante programmare sia interessante, a me non piace.
    per me è una necessità strettamente legata al mio futuro. perché tra un paio di anni al massimo mi trasferisco in giappone, e da quello che ho capito, e da come stanno le cose in questo momento, l'unica cosa che posso fare per poter vivere la, con un contratto fulltime, è andare a fare il programmatore di giochi.
    quindi dovrò andare a fare una scuola di specializzazione la per questo.
    il fatto è che 2 anni mi sembrano pochi per imparare la mole di cose da sapere per non essere un peso in classe poi, e se ci aggiungi che per quanto interessante possa essere, a me non è che piaccia davvero farlo, per me è più un "pratica a menetta e forse capisco i concetti". ora sto facendo java perché lo facciamo anche a scuola, ma la mentalità che dovrei sviluppare facendo java, dovrebbe essere la stessa che poi dovrò usare con C++, C#, e via dicendo.
    e quindi niente, naturalmente mi demoralizzo perché mi sembra di fare un passo indietro verso dove voglio arrivare.
    però anche se te mi dici "leggi al documentazione", ok io la leggo, ma poi succede che, magari non capisco una cosa, vado a vedermi come funziona, e la ne trovo un'altra che non capisco, e via a cascata. questo perché le mie basi sono quelle di un igloo in mezzo al deserto, e non mi sto lamentando di questo.
    mettere entrambe le soluzioni mi farebbe solo uscire scemo da tutto questo, al mio stato attuale, quindi mi dedicherò a quella proposta da te del filter.
    se ho capito bene, qua si tratta solo di scegliere quanto visualizzare in base a 2 semplici scelte dell'utente.
    a me verrebbe quindi da dire che devo passare il valore dello spinner a getRowCount, e leggendo la descrizione del metodo, sarei anche portato a pensare che sto facendo giusto. poi però mi viene in mente: "aspetta, ma qua abbiamo menzionato anche i filtri, che dovrebbe permettermi di visualizzare solo n righe" quindi che diamine faccio? la risposta potrebbe essere "vanno usati entrambi" e a questo punto implodo
    poi leggendo quello che hai scritto sul rimuovere, mi viene da pensare che se tolgo dalla mia lista i costruttori delle automobili, allora diminuisco il numero di righe della tabella, mentre aggiungendo costruttori alla lista, allora visualizzo più righe, io così la penso. aggiungo/tolto elementi alla lista -> il getValueAt si allinea con tutto e mi mostra i risultati, dopo avergli comunicato i cambiamenti.
    questa è la linea di pensiero che ho, probabilmente è ancora sbagliata.
    comunquesia faccio tutto random perché senno tantovaleva fare un database e questa cosa avrebbe avuto meno senso secondo me. generavo tutto, buttavo in un db e poi visualizzavo. magari è la stessa cosa ma son già incasinato così, figurati a gestire un database
    la guida di html.it è valida?
  • Re: Jframe jtable

    Quindi, recuperando la calma (sta arrivando la pizza) e facendo le cose con ordine, un passo alla volta.
    ricevo un valore dallo spinner e in base a questo valore aggiungo/tolgo elementi dalla mia lista (il filtro ho deciso che è meglio se evito per il momento)
    quindi i passaggi sono:
    il valore viene immesso -> il listener lo becca -> dentro al listener richiamo il metodo di aggiunta/rimozione righe a cui passo il valore dello spinner -> il metodo, a seconda di che valore io passo farò un add oppure un remove -> i listener appropriati, fire...deleted e fire...insert comunicheranno i cambiamenti di stato
    secondo questo ragionamento, dove mi pare di aver seguito tutto quello che mi avete detto, anche se forse con i termini non ci ho preso molto, ho scritto questo

    spinner, sempre uguale
    
    SpinnerModel jsm = new SpinnerNumberModel(10, 0, 1000, 5);
    		final JSpinner js = new JSpinner(jsm);
    		JButton b = new JButton("Visualizza");
    		b.addActionListener(new ActionListener()
    		{
    			public void actionPerformed(ActionEvent e)
    			{
    				Integer i = (Integer)js.getValue();
    				atb.removeRow(i);
    			}
    		});
    
    e metodo che rimuove/aggiunge. non essendo un metodo prefabbricato di abstracttablemodel me lo posso gestire come più mi pare e piace s eho capito bene, quindi ho scritto
    
    public void setRow(int rowIndex)
    	{
    		if (automobile.size() < rowIndex)
    		{
    			autmobile.removeRange(automobile.size(), rowIndex);
    			fireTableRowsDeleted(rowIndex, rowIndex);
    		}
    		else
    		{
    			automobile.add(new Automobili());
    			fireTableRowsInsert(automobile.size(), rowIndex);
    		}
    	}
    
    guardando un esempio di andbin su html ho visto che lui non ha usato il fire...updadated o fire...changed quindi mi pare di capire che basta un solo listener no?
    bene ora, la domanda è: sto procedendo bene o ancora manca qualcosa? o sto ancora sbagliando?
    EDIT:
    di per se il codice il è giusto. almeno come codice.
    poi mi tira giù migliaia di errori in esecuzione
    
    Exception in thread "AWT-EventQueue-0" java.lang.NoSuchMethodError: AutomobileTa
    bleModel.setRow(I)V
            at FrameTabella$2.actionPerformed(FrameTabella.java:96)
            at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
            at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
            at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
            at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
            at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Sour
    ce)
            at java.awt.Component.processMouseEvent(Unknown Source)
            at javax.swing.JComponent.processMouseEvent(Unknown Source)
            at java.awt.Component.processEvent(Unknown Source)
            at java.awt.Container.processEvent(Unknown Source)
            at java.awt.Component.dispatchEventImpl(Unknown Source)
            at java.awt.Container.dispatchEventImpl(Unknown Source)
            at java.awt.Component.dispatchEvent(Unknown Source)
            at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
            at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
            at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
            at java.awt.Container.dispatchEventImpl(Unknown Source)
            at java.awt.Window.dispatchEventImpl(Unknown Source)
            at java.awt.Component.dispatchEvent(Unknown Source)
            at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
            at java.awt.EventQueue.access$500(Unknown Source)
            at java.awt.EventQueue$3.run(Unknown Source)
            at java.awt.EventQueue$3.run(Unknown Source)
            at java.security.AccessController.doPrivileged(Native Method)
            at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionP
    rivilege(Unknown Source)
            at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionP
    rivilege(Unknown Source)
            at java.awt.EventQueue$4.run(Unknown Source)
            at java.awt.EventQueue$4.run(Unknown Source)
            at java.security.AccessController.doPrivileged(Native Method)
            at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionP
    rivilege(Unknown Source)
            at java.awt.EventQueue.dispatchEvent(Unknown Source)
            at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
            at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
            at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
            at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
            at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
            at java.awt.EventDispatchThread.run(Unknown Source)
    
    tutta sta roba qua cosa vuol dire mmh? ho letto in giro e alcuni di questi escono perché non ci sono elementi nella lista/array ma gli altri?

    EDIT2:
    perché quando compilo, prima mi viene il seguente errore
    
    .\FrameTabella.java:95: error: cannot find symbol
                                    Integer i = (Integer)js.getValue().getNumber();
                                                                      ^
      symbol:   method getNumber()
      location: class Object
    .\AutomobileTableModel.java:48: error: cannot find symbol
                            automobili.removeRange(automobili.size(), rowIndex);
                                      ^
      symbol:   method removeRange(int,int)
      location: variable automobili of type List<Automobili>
    .\AutomobileTableModel.java:54: error: cannot find symbol
                            fireTableRowsInsert(automobili.size(), rowIndex);
                            ^
      symbol:   method fireTableRowsInsert(int,int)
      location: class AutomobileTableModel
    3 errors
    
    e dopo quando risalvo il file non mi da più l'errore? ._.
    questa cosa mi sta facendo incazzare. ogni volta che modifico il Frame Tabella per provare a correggere tutta quella serie di errori, che leggendo un po' in giro mi pare di aver capito che accadono perché passo null pointer, mi esce sto errore che mi tocca andare nel file, cancellare e rimettere la stessa lettera a caso, e non me lo dà più. perché? perché fa così? ._.
  • Re: Jframe jtable

    KuroKami69 ha scritto:


    Ma vedi, il fatto che nonostante programmare sia interessante, a me non piace. [...]
    Non sono indicato a dare consigli di nessun genere su questo tipo di lavoro, sto appena iniziando a fare uno stage, ma se dici che non ti piace poi così tanto forse non ne vale tanto la pena no? Magari java non è il linguaggio che fa per te, e troverai altro di molto appassionante, ma non è che programmare videogiochi sia facile eh ... Ma devi avere innanzitutto molta passione e stimoli dal mio punto di vista.

    KuroKami69 ha scritto:


    Però anche se te mi dici "leggi al documentazione", ok io la leggo, ma poi succede che, magari non capisco una cosa, vado a vedermi come funziona, e la ne trovo un'altra che non capisco, e via a cascata.
    Capisco, può essere frustrante. Ma hai bisogno di qualche indicazione, e quello è il punto di partenza, lascia stare le cose troppo complicate ma prova sempre a controllare cosa fa un metodo che invochi, quando non lo sai già o non è ovvio. Se poi questo implica una catena infernale pazienza, puoi chiedere qui o cercare sui libri quando ne avrai.

    KuroKami69 ha scritto:


    Mettere entrambe le soluzioni mi farebbe solo uscire scemo da tutto questo, al mio stato attuale, quindi mi dedicherò a quella proposta da te del filter.
    Se ho capito bene, qua si tratta solo di scegliere quanto visualizzare in base a 2 semplici scelte dell'utente.
    A me verrebbe quindi da dire che devo passare il valore dello spinner a getRowCount, e leggendo la descrizione del metodo, sarei anche portato a pensare che sto facendo giusto. Poi però mi viene in mente: "aspetta, ma qua abbiamo menzionato anche i filtri, che dovrebbe permettermi di visualizzare solo n righe" quindi che diamine faccio?
    La logica è quella. JTable chiede al proprio model quante righe deve mostrare, quindi tu devi solo "convincere" getRowCount () del TableModel a ritornare quello che vuoi tu. "Passare" un valore a getRowCount () lo fai mantenendo una variabile nel TableModel, che andrai a modificare dall'esterno con un metodo set. Attenzione che se il valore è maggiore del numero di automobili presenti nella lista, non dovresti aggiungere automobili in questo caso, ma ti basta un controllo, prova a farlo!

    I filtri li ho menzionati per darti una panoramica, potresti averne bisogno in futuro, in questo caso è più complicato, lascia perdere, non stai filtrando per testo, vuoi solo limitare il numero di risultati.

    KuroKami69 ha scritto:


    poi leggendo quello che hai scritto sul rimuovere, mi viene da pensare che se tolgo dalla mia lista i costruttori delle automobili, allora diminuisco il numero di righe della tabella, mentre aggiungendo costruttori alla lista, allora visualizzo più righe, io così la penso. Aggiungo/tolto elementi alla lista -> il getValueAt si allinea con tutto e mi mostra i risultati, dopo avergli comunicato i cambiamenti.
    Questa è la linea di pensiero che ho, probabilmente è ancora sbagliata [...]
    No, non è sbagliato, il concetto è giusto. I costruttori però non c'entrano nulla, tu alla lista aggiungi/rimuovi direttamente gli oggetti Automobile, i costruttori sono metodi, anche se particolari.
    Quindi potresti avere un metodo addAutomobile (Automobile auto) nel TableModel, e un anche un metodo removeAutomobile.

    Perché addAutomobile prende in ingresso un parametro di tipo Automobile e non intero? E' quello che dicevo prima, il TableModel non saprebbe che farsene di un intero, lui ha una lista di automobili, quindi l'operazione che deve fare è solo un add sulla lista e una notifica ai listener.
    Al massimo puoi permettere di specificare anche la posizione di inserimento nella tabella, ad esempio invece che aggiungere la nuova auto come ultima, la inserisci come prima.

    Ma se passi solo un intero al metodo add (), dai un compito al TableModel che lui non dovrebbe avere, ad esempio inventarsi con che parametri deve costruire la nuova auto, non è lì che lo devi fare.
    Se non vuoi ancora inserire valori per l'auto creata ok, allora quando vuoi inserire un'automobile non richiami subito il addAutomobile (Automobile auto) del table model, ma prima ne costruisci una (con i valori che vuoi) che poi passi al table model.

    Cosa riceverà invece il removeAutomobile ? Il remove di ArrayList puoi chiamarlo sia con l'oggetto da rimuovere, sia con l'indice dell'oggetto da rimuovere. Sarebbe difficile passare il riferimento dell'auto da rimuovere, è molto più semplice passare l'indice della lista, che corrisponderà alla riga da eliminare. Potresti ad esempio cliccare su una riga, e aggiungere un pulsante che quando premuto richiama il removeAutomobile del table model passando come parametro l'indice della riga cliccata (che lo prendi con una singola istruzione da JTable).

    Per quanto riguarda la guida, è passato molto tempo da quando l'ho letta e forse è anche cambiata, prendila così com'è, come un'infarinatura del linguaggio, io ne ho lette molte da lì prima di iniziare un nuovo linguaggio di programmazione, puoi trovare cose utili, ma non aspettarti che sia "completa".

    KuroKami69 ha scritto:


    Ricevo un valore dallo spinner e in base a questo valore aggiungo/tolgo elementi dalla mia lista (il filtro ho deciso che è meglio se evito per il momento). Quindi i passaggi sono:
    il valore viene immesso -> il listener lo becca -> dentro al listener richiamo il metodo di aggiunta/rimozione righe a cui passo il valore dello spinner -> il metodo, a seconda di che valore io passo farò un add oppure un remove -> i listener appropriati, fire...deleted e fire...insert comunicheranno i cambiamenti di stato.
    Secondo questo ragionamento, dove mi pare di aver seguito tutto quello che mi avete detto, anche se forse con i termini non ci ho preso molto, ho scritto questo:

    [...]
    Il codice dentro all'actionPerformed del pulsante va bene per cancellare una riga, magari cambia il nome del pulsante da "Visualizza" a "Rimuovi".
    Ora però stai prendendo il valore dello spinner per dire quale riga rimuovere, puoi anche farlo, ma per il resto dei compiti dovresti allora usare altri componenti. Consiglio sempre un pulsante del tipo "Rimuovi riga selezionata" che cancelli la riga selezionata della tabella.

    Il metodo per aggiungere/rimuovere non è prefabbricato nell'AbstractTableModel, quindi sì lo devi gestire tu. Il setRow (), alla luce di quanto ho detto all'inizio del messaggio, invece, non va molto bene, vedi sopra quello che ho scritto.

    Tutti i controlli li fai nella classe con l'interfaccia grafica, se vuoi scegliere in base a un valore se vadano aggiunte o rimosse righe. Poi in base a quello che vuoi richiami nel table model una o più volte addAutomobile o removeAutomobile.
    Non fare "indovinare" al table model quello che deve fare.

    Se vuoi scrivere anche un metodo removeRange nel table model, che cancella più di una riga alla volta, o un addAutomobili che prende più di una automobile alla volta da aggiungere alla lista ok.
    Ma non usare appunto un setRow nel table model (tra l'altro ricordati cosa si diceva sui metodi set, il nome setRow (int rowIndex) per chiunque vorrebbe dire che tu modifica la riga all'indice passato, non che fai altro), usa il/gli add/remove.


    KuroKami69 ha scritto:


    [...]
    Mi tira giù migliaia di errori in esecuzione
    
    Exception in thread "AWT-EventQueue-0" java.lang.NoSuchMethodError: AutomobileTa
    bleModel.setRow(I)V
            at FrameTabella$2.actionPerformed(FrameTabella.java:96)
            at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
           ......................................................................................
    
    tutta sta roba qua cosa vuol dire mmh? ho letto in giro e alcuni di questi escono perché non ci sono elementi nella lista/array ma gli altri?
    No questo errore vuol dire semplicemente che il file .class AutomobileTableModel non ha all'interno la dichiarazione del metodo setRow (che come detto va cambiato).
    Questo probabilmente perché hai ricompilato solo gli altri file, il file AutomobileTableModel invece non è stato ricompilato (quindi è stato trovato un file .class, precedente e il compilatore ha deciso di non ricompilare, non saprei dirti esattamente quando questo accada) ed è alla versione "vecchia".

    KuroKami69 ha scritto:


    Perché quando compilo, prima mi viene il seguente errore:
    
    1) .\FrameTabella.java:95: error: cannot find symbol
                                    Integer i = (Integer)js.getValue().getNumber();
                                                                      ^
      symbol:   method getNumber()
      location: class Object
      
    2) .\AutomobileTableModel.java:48: error: cannot find symbol
                            automobili.removeRange(automobili.size(), rowIndex);
                                      ^
      symbol:   method removeRange(int,int)
      location: variable automobili of type List<Automobili>
      
    3) .\AutomobileTableModel.java:54: error: cannot find symbol
                            fireTableRowsInsert(automobili.size(), rowIndex);
                            ^
      symbol:   method fireTableRowsInsert(int,int)
      location: class AutomobileTableModel
    3 errors
    
    e dopo quando risalvo il file non mi da più l'errore? [...]
    1) Perché stai usando un getNumber? Il getValue con il cast a Integer è corretto. Tra l'altro ora il getNumber () lo stai richiamando su un Object, come vedi dal messaggio di errore, non su un Integer, se volessi applicarlo direttamente sul valore ottenuto dal cast dovresti usare le parentesi:

    ((Integer) js.getValue()).getNumber();

    Questo richiama getNumber () su un reference di tipo Integer (ovviamente il cast può dare errore, il compilatore si sta "fidando" che troverà un Integer), ma comunque sarebbe un errore, perché Integer non ha un metodo getNumber.

    2) Leggi sempre bene il messaggio, sotto dice:

    variable automobili of type List<Automobili>

    removeRange è definito in ArrayList, ma non in List, e automobili è dichiarato come List. Questo perché @andbin voleva scrivere un codice più generalizzato, poi anche se tu effettivamente crei un arraylist il compilatore non può saperlo, perché è lecito trovare qualcos'altro.
    Quindi puoi pure dichiarare la lista come ArrayList in questo caso.

    3) Il metodo si chiama fireTableRowsInserted.

    E' importante capire bene i messaggi d'errore, una delle prime cose a cui ti devi abituare. Non so perché se modifichi il file non ti dia più errore, mi pare molto strano, quegli sono effettivamente tre errori e il sorgente non può essere compilato.
  • Re: Jframe jtable

    Ansharja ha scritto:


    KuroKami69 ha scritto:


    Ma vedi, il fatto che nonostante programmare sia interessante, a me non piace. [...]
    Non sono indicato a dare consigli di nessun genere su questo tipo di lavoro, sto appena iniziando a fare uno stage, ma se dici che non ti piace poi così tanto forse non ne vale tanto la pena no? Magari java non è il linguaggio che fa per te, e troverai altro di molto appassionante, ma non è che programmare videogiochi sia facile eh ... Ma devi avere innanzitutto molta passione e stimoli dal mio punto di vista.
    capisco perfettamente, anzi, condivido questo tuo punto di vista. ma come ho detto, l'unica cosa che voglio è vivere in giappone. e per poterlo fare, in questo momento, l'unica strada lavoratica percorribile, è quella di programmatore di giochi. magari una volta che imparo allora inizierà a piacermi anche, chissà

    Ansharja ha scritto:


    KuroKami69 ha scritto:


    Però anche se te mi dici "leggi al documentazione", ok io la leggo, ma poi succede che, magari non capisco una cosa, vado a vedermi come funziona, e la ne trovo un'altra che non capisco, e via a cascata.
    Capisco, può essere frustrante. Ma hai bisogno di qualche indicazione, e quello è il punto di partenza, lascia stare le cose troppo complicate ma prova sempre a controllare cosa fa un metodo che invochi, quando non lo sai già o non è ovvio. Se poi questo implica una catena infernale pazienza, puoi chiedere qui o cercare sui libri quando ne avrai.
    un libro già lo ho e l'altro deve arrivare

    Ansharja ha scritto:


    KuroKami69 ha scritto:


    Mettere entrambe le soluzioni mi farebbe solo uscire scemo da tutto questo, al mio stato attuale, quindi mi dedicherò a quella proposta da te del filter.
    Se ho capito bene, qua si tratta solo di scegliere quanto visualizzare in base a 2 semplici scelte dell'utente.
    A me verrebbe quindi da dire che devo passare il valore dello spinner a getRowCount, e leggendo la descrizione del metodo, sarei anche portato a pensare che sto facendo giusto. Poi però mi viene in mente: "aspetta, ma qua abbiamo menzionato anche i filtri, che dovrebbe permettermi di visualizzare solo n righe" quindi che diamine faccio?
    La logica è quella. JTable chiede al proprio model quante righe deve mostrare, quindi tu devi solo "convincere" getRowCount () del TableModel a ritornare quello che vuoi tu. "Passare" un valore a getRowCount () lo fai mantenendo una variabile nel TableModel, che andrai a modificare dall'esterno con un metodo set. Attenzione che se il valore è maggiore del numero di automobili presenti nella lista, non dovresti aggiungere automobili in questo caso, ma ti basta un controllo, prova a farlo!

    I filtri li ho menzionati per darti una panoramica, potresti averne bisogno in futuro, in questo caso è più complicato, lascia perdere, non stai filtrando per testo, vuoi solo limitare il numero di risultati.
    se il valore è maggiore, vuol dire che voglio visualizzare più elementi, quindi è normale aggiungere auto no? mmh o forse non ho capito di che valore parli? mmh

    Ansharja ha scritto:


    KuroKami69 ha scritto:


    poi leggendo quello che hai scritto sul rimuovere, mi viene da pensare che se tolgo dalla mia lista i costruttori delle automobili, allora diminuisco il numero di righe della tabella, mentre aggiungendo costruttori alla lista, allora visualizzo più righe, io così la penso. Aggiungo/tolto elementi alla lista -> il getValueAt si allinea con tutto e mi mostra i risultati, dopo avergli comunicato i cambiamenti.
    Questa è la linea di pensiero che ho, probabilmente è ancora sbagliata [...]
    No, non è sbagliato, il concetto è giusto. I costruttori però non c'entrano nulla, tu alla lista aggiungi/rimuovi direttamente gli oggetti Automobile, i costruttori sono metodi, anche se particolari.
    Quindi potresti avere un metodo addAutomobile (Automobile auto) nel TableModel, e un anche un metodo removeAutomobile.

    Perché addAutomobile prende in ingresso un parametro di tipo Automobile e non intero? E' quello che dicevo prima, il TableModel non saprebbe che farsene di un intero, lui ha una lista di automobili, quindi l'operazione che deve fare è solo un add sulla lista e una notifica ai listener.
    Al massimo puoi permettere di specificare anche la posizione di inserimento nella tabella, ad esempio invece che aggiungere la nuova auto come ultima, la inserisci come prima.

    Ma se passi solo un intero al metodo add (), dai un compito al TableModel che lui non dovrebbe avere, ad esempio inventarsi con che parametri deve costruire la nuova auto, non è lì che lo devi fare.
    Se non vuoi ancora inserire valori per l'auto creata ok, allora quando vuoi inserire un'automobile non richiami subito il addAutomobile (Automobile auto) del table model, ma prima ne costruisci una (con i valori che vuoi) che poi passi al table model.

    Cosa riceverà invece il removeAutomobile ? Il remove di ArrayList puoi chiamarlo sia con l'oggetto da rimuovere, sia con l'indice dell'oggetto da rimuovere. Sarebbe difficile passare il riferimento dell'auto da rimuovere, è molto più semplice passare l'indice della lista, che corrisponderà alla riga da eliminare. Potresti ad esempio cliccare su una riga, e aggiungere un pulsante che quando premuto richiama il removeAutomobile del table model passando come parametro l'indice della riga cliccata (che lo prendi con una singola istruzione da JTable).

    Per quanto riguarda la guida, è passato molto tempo da quando l'ho letta e forse è anche cambiata, prendila così com'è, come un'infarinatura del linguaggio, io ne ho lette molte da lì prima di iniziare un nuovo linguaggio di programmazione, puoi trovare cose utili, ma non aspettarti che sia "completa".

    KuroKami69 ha scritto:


    Ricevo un valore dallo spinner e in base a questo valore aggiungo/tolgo elementi dalla mia lista (il filtro ho deciso che è meglio se evito per il momento). Quindi i passaggi sono:
    il valore viene immesso -> il listener lo becca -> dentro al listener richiamo il metodo di aggiunta/rimozione righe a cui passo il valore dello spinner -> il metodo, a seconda di che valore io passo farò un add oppure un remove -> i listener appropriati, fire...deleted e fire...insert comunicheranno i cambiamenti di stato.
    Secondo questo ragionamento, dove mi pare di aver seguito tutto quello che mi avete detto, anche se forse con i termini non ci ho preso molto, ho scritto questo:

    [...]
    Il codice dentro all'actionPerformed del pulsante va bene per cancellare una riga, magari cambia il nome del pulsante da "Visualizza" a "Rimuovi".
    Ora però stai prendendo il valore dello spinner per dire quale riga rimuovere, puoi anche farlo, ma per il resto dei compiti dovresti allora usare altri componenti. Consiglio sempre un pulsante del tipo "Rimuovi riga selezionata" che cancelli la riga selezionata della tabella.

    Il metodo per aggiungere/rimuovere non è prefabbricato nell'AbstractTableModel, quindi sì lo devi gestire tu. Il setRow (), alla luce di quanto ho detto all'inizio del messaggio, invece, non va molto bene, vedi sopra quello che ho scritto.

    Tutti i controlli li fai nella classe con l'interfaccia grafica, se vuoi scegliere in base a un valore se vadano aggiunte o rimosse righe. Poi in base a quello che vuoi richiami nel table model una o più volte addAutomobile o removeAutomobile.
    Non fare "indovinare" al table model quello che deve fare.

    Se vuoi scrivere anche un metodo removeRange nel table model, che cancella più di una riga alla volta, o un addAutomobili che prende più di una automobile alla volta da aggiungere alla lista ok.
    Ma non usare appunto un setRow nel table model (tra l'altro ricordati cosa si diceva sui metodi set, il nome setRow (int rowIndex) per chiunque vorrebbe dire che tu modifica la riga all'indice passato, non che fai altro), usa il/gli add/remove.
    sostanzialmente non va bene avere un metodo che fa entrambi? cioè apparte il particolare che non funziona il remove, l'add funziona con il metodo che ho fatto (ci ho aggiunto dei while).


    Ansharja ha scritto:


    KuroKami69 ha scritto:


    [...]
    Mi tira giù migliaia di errori in esecuzione
    
    Exception in thread "AWT-EventQueue-0" java.lang.NoSuchMethodError: AutomobileTa
    bleModel.setRow(I)V
            at FrameTabella$2.actionPerformed(FrameTabella.java:96)
            at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
           ......................................................................................
    
    tutta sta roba qua cosa vuol dire mmh? ho letto in giro e alcuni di questi escono perché non ci sono elementi nella lista/array ma gli altri?
    No questo errore vuol dire semplicemente che il file .class AutomobileTableModel non ha all'interno la dichiarazione del metodo setRow (che come detto va cambiato).
    Questo probabilmente perché hai ricompilato solo gli altri file, il file AutomobileTableModel invece non è stato ricompilato (quindi è stato trovato un file .class, precedente e il compilatore ha deciso di non ricompilare, non saprei dirti esattamente quando questo accada) ed è alla versione "vecchia".
    in effetti non mi compilava il tablemodel. ho cancellato tutti i file class e ho ricompilato e non mi ha dato problemi

    Ansharja ha scritto:


    KuroKami69 ha scritto:


    Perché quando compilo, prima mi viene il seguente errore:
    
    1) .\FrameTabella.java:95: error: cannot find symbol
                                    Integer i = (Integer)js.getValue().getNumber();
                                                                      ^
      symbol:   method getNumber()
      location: class Object
      
    2) .\AutomobileTableModel.java:48: error: cannot find symbol
                            automobili.removeRange(automobili.size(), rowIndex);
                                      ^
      symbol:   method removeRange(int,int)
      location: variable automobili of type List<Automobili>
      
    3) .\AutomobileTableModel.java:54: error: cannot find symbol
                            fireTableRowsInsert(automobili.size(), rowIndex);
                            ^
      symbol:   method fireTableRowsInsert(int,int)
      location: class AutomobileTableModel
    3 errors
    
    e dopo quando risalvo il file non mi da più l'errore? [...]
    1) Perché stai usando un getNumber? Il getValue con il cast a Integer è corretto. Tra l'altro ora il getNumber () lo stai richiamando su un Object, come vedi dal messaggio di errore, non su un Integer, se volessi applicarlo direttamente sul valore ottenuto dal cast dovresti usare le parentesi:

    ((Integer) js.getValue()).getNumber();

    Questo richiama getNumber () su un reference di tipo Integer (ovviamente il cast può dare errore, il compilatore si sta "fidando" che troverà un Integer), ma comunque sarebbe un errore, perché Integer non ha un metodo getNumber.

    2) Leggi sempre bene il messaggio, sotto dice:

    variable automobili of type List<Automobili>

    removeRange è definito in ArrayList, ma non in List, e automobili è dichiarato come List. Questo perché @andbin voleva scrivere un codice più generalizzato, poi anche se tu effettivamente crei un arraylist il compilatore non può saperlo, perché è lecito trovare qualcos'altro.
    Quindi puoi pure dichiarare la lista come ArrayList in questo caso.

    3) Il metodo si chiama fireTableRowsInserted.

    E' importante capire bene i messaggi d'errore, una delle prime cose a cui ti devi abituare. Non so perché se modifichi il file non ti dia più errore, mi pare molto strano, quegli sono effettivamente tre errori e il sorgente non può essere compilato.
    il getnumber lo avevo messo su consiglio di un'amica, ovviamente è risultato sbagliato, e lo avevo già tolto
    vero, ieri ero andato sulla documentazione ma dopo un po' che ho girovagato su internet, mi ero totalmente scordato che avevo aperto quella degli arraylist e non delle list ahahaha
    io avevo fatto un copia e incolla del fire... forse avrò mancato le ultime 2 lettere
    ok onestamente preferirei discuterne su skype, leggere qua senza avere la possibilità di domandare al momento giusto mi mette in difficoltà e mi perdo spesso
    parlando onestamente, per quanto concettualmente possa essere sbagliato avere un metodo unico nel tablemodel che fa add e remove, finchè funziona mi va bene, quindi preferirei non toccarlo, se non per far funzionare il remove

    EDIT:
    ok avevo dimenticato il rowIndex--; nel while del remove ahahahah
    ora funziona
  • Re: Jframe jtable

    Nuova domanda. un attimo differente rispetto al contesto
    
    private static final String colonne[] = {"Marca", "Modello", "Stato", "Prezzo", "Tipo", "Colore", "KM", "Anno Imm.", "Scadenza Bollo", "Targa", "Posti", "Portiere", "Bagagliaio", "Cilindrata", "Cilindri", "Cavalli", "Peso/Potenza", "Alimentazione", "Consumo", "Trazione", "Cambio", "Marce", "Lunghezza", "Massa a Vuoto", "Altezza Car.", "Tettuccio"};
    
    c'è un modo per dirgli che SE il JCheckBox è spuntato, allora al posto di "Cavalli" mi mostra "KW"? cambiare il nome della colonna dinamicamente insomma
  • Re: Jframe jtable

    KuroKami69 ha scritto:


    Se il valore è maggiore, vuol dire che voglio visualizzare più elementi, quindi è normale aggiungere auto no? mmh o forse non ho capito di che valore parli? mmh
    Mi stavo ancora riferendo alla situazione in cui lo spinner si limita a dire alla tabella il limite di risultati da mostrare. Io direi che è quella la situazione "normale".
    Quella di aggiungere o togliere auto in modo dinamico è un'idea un po' particolare che hai avuto tu, e torno a ripetere che invece che con uno spinner io lo farei con dei bottoni, anche perché creare/togliere auto ogni volta che incrementi/decrementi lo spinner con le frecce è molto più oneroso.

    KuroKami69 ha scritto:


    Sostanzialmente non va bene avere un metodo che fa entrambi? cioè apparte il particolare che non funziona il remove, l'add funziona con il metodo che ho fatto (ci ho aggiunto dei while).
    Nel table model no. Le classi vanno ben distinte nei compiti che devono svolgere, e vanno scritte in modo da essere pulite, semplici, riutilizzabili. Il modello di una tabella serve ad esporre i dati e le altre informazioni alla tabella, ed è logico che possa avere dei metodi per modificare l'insieme dei dati.
    Ma se hai una lista di automobili, il modello prenderà in ingresso una o più automobili da aggiungere, e uno o più indici delle automobili da rimuovere nel caso della rimozione. Il resto della logica non è di competenza del modello.

    Un eventuale metodo aggiornaRigheTabella () che ti sincronizza il numero di righe della tabella con il valore dello spinner, se vuoi farlo, fallo al di fuori dal modello, a te non cambia quasi nulla come codice da scrivere, per la qualità del codice fa una differenza enorme.

    KuroKami69 ha scritto:


    Nuova domanda. un attimo differente rispetto al contesto
    
    private static final String colonne[] = {"Marca", "Modello", "Stato", "Prezzo", "Tipo", "Colore", "KM", "Anno Imm.", "Scadenza Bollo", "Targa", "Posti", "Portiere", "Bagagliaio", "Cilindrata", "Cilindri", "Cavalli", "Peso/Potenza", "Alimentazione", "Consumo", "Trazione", "Cambio", "Marce", "Lunghezza", "Massa a Vuoto", "Altezza Car.", "Tettuccio"};
    
    c'è un modo per dirgli che SE il JCheckBox è spuntato, allora al posto di "Cavalli" mi mostra "KW"? cambiare il nome della colonna dinamicamente insomma
    Quel vettore di stringhe di nomi dichiarato in quel modo non dovresti modificarlo (l'intento è che sia una variabile di classe e final, ma in realtà il contenuto potresti anche cambiarlo), ma non serve neanche. Se è solo quella la colonna che vuoi cambiare puoi modificare il public String getColumnName(int columnIndex) { del modello, è quello che restituisce il nome della colonna per l'indice passato.
    Come fa il modello a sapere se il checkbox in un certo istante è selezionato oppure no? Dovresti aggiornarlo tu, ad esempio mantieni un valore boolean all'interno del modello e quando selezioni o deselezioni il checkbox richiami un metodo set che cambia il valore di quella variabile. Poi nel getColumnName se l'indice è quello della colonna Cavalli controlli il valore del boolean e ritorni uno o l'altro nome.

    Non è una soluzione elegante, ad ora non mi viene in mente nulla di meglio che sia semplice.

    EDIT: Piccola correzione, il vettore di stringhe è modificabile internamente, anche se l'intento sarebbe di evitarlo.
  • Re: Jframe jtable

    Bene ti ringrazio per la risposta
    torno a ripetere che nonostante ho capito quello che vuoi dire, e posso anche essere d'accordo con te, per questo esercizio, finchè il codice funziona, allora va bene. se diventerò un po' più bravo allora posso anche riprendere in mano questo esercizio e farne una V2 migliore
    ma intanto finchè funziona allora mi sta bene!
    quindi sostanzialmente basta che faccio un if mmh non ci avevo pensato! sostanzialmente, mettiamo che ho 0 quando il box non è spuntato e 1 quando è spuntato, su una variabile c, posso fare un
    
    if (c == 0)
    colonne[16] = "Cavalli";
    else
    colonne[16] = "KW";
    
    nel listener del bottone ho questo atb.fireTableDataChanged(); quindi in teoria dovrebbe funzionare giusto?
    altra cosa che non ho capito e non ho trovato nulla di utile online, come funziona setAutoCreateRowSorter(true);? in teoria dovrebbe abilitare la funzione di sort valori sulle colonne ma quando avvio il programma mi da una serie di errori simili a prima quindi mi viene da pensare che non è in grado di gestire assieme sia string che int che double ma forse mi sbaglio io
    EDIT:
    ok ho provato ma non accade assolutamente niente
  • Re: Jframe jtable

    KuroKami69 ha scritto:


    Quindi sostanzialmente basta che faccio un if mmh non ci avevo pensato! sostanzialmente, mettiamo che ho 0 quando il box non è spuntato e 1 quando è spuntato, su una variabile c, posso fare un:
    
    if (c == 0)
    colonne[16] = "Cavalli";
    else
    colonne[16] = "KW";
    
    Nel listener del bottone ho questo atb.fireTableDataChanged(); quindi in teoria dovrebbe funzionare giusto?
    Perché usare 0 o 1 quando il valore del checkbox è true o false? Usa un boolean no?

    Come detto prima, meglio non modificare il contenuto dell'array. Cambia semplicemente il valore restituito dal getColumnName ():
    
    public String getColumnName(int columnIndex) {
       if (columnIndex == 16 && mostraKV) return "KV";
       else return colonne [columnIndex];
    }
    
    Dove ovviamente mostraKV è la tua variabile booleana che devi modificare quando il checkbox viene selezionato/deselezionato. In corrispondenza e in modo quasi analogo va modificato anche il getValueAt.

    KuroKami69 ha scritto:


    Altra cosa che non ho capito e non ho trovato nulla di utile online, come funziona setAutoCreateRowSorter(true);? in teoria dovrebbe abilitare la funzione di sort valori sulle colonne ma quando avvio il programma mi da una serie di errori simili a prima quindi mi viene da pensare che non è in grado di gestire assieme sia string che int che double ma forse mi sbaglio io
    No, dovrebbe esserne perfettamente in grado. Posta gli errori che ottieni.
Devi accedere o registrarti per scrivere nel forum
230 risposte