Jframe jtable

di il
230 risposte

230 Risposte - Pagina 14

  • Re: Jframe jtable

    No, raffinata no.
    In passato ho fatto un programma dove ricreavo la tabella da zero ogni volta che volevo mostrare/nascondere una colonna, quindi la popolavo completamente (usavo il model.addRow ()) e poi rimuovevo ogni colonna da togliere con tabella.getColumnModel().removeColumn (indiceColonnaDaRimuovere). Non mi pare proprio una buona soluzione, però, anche se è molto più semplice di quello che potresti arrivare a fare con gli indici e meno "pericoloso".

    Il problema è che una volta che rimuovi una colonna in questo modo, se vuoi riaggiungerla devi salvarti il riferimento da qualche parte.

    E' quello che viene fatto ad esempio in questo codice, usando una mappa.

    Trovi un altro esempio, qui, con il relativo codice qui.

    Sono soluzioni di alcuni "guru" di swing su StackOverflow (numero 1 e 5 come punteggio per le risposte nella categoria swing), mi sento di dire che se le hanno proposte in quel modo probabilmente non ce ne sono di molto "migliori" O magari anche sì, ma con altri punti deboli ...

    Se hai voglia di capire come funzionano, buona lettura
  • Re: Jframe jtable

    Ci darò un'occhiata, magari vedo che come soluzione mi piace e decido di adottarla mmh grazie mille
  • Re: Jframe jtable

    Ok ci ho dato un'occhiata, devo dire che più di tanto macchinoso non è, ho capito come, grossomodo, funziona e MAGARI potrei prendere in considerazione l'idea di farlo. MA prima devo riuscire a sistemare il mio attuale codice, altrimenti non ha senso passare a una versione più avanzata
  • Re: Jframe jtable

    Ansharja ha scritto:


    
    public void addVeicolo (Veicolo veicolo) {
       veicoli.add (veicolo);
       // inserisci un fireTableRowsInserted con gli indici corretti
    }
    public void removeVeicolo (int rowIndex) {
       // controlli che la rimozione sia corretta
       if (rowIndex < 0 || rowIndex >= veicoli.size ()) return;
       veicoli.remove (rowIndex);
       // inserisci un fireTableRowsDeleted con gli indici corretti
    }
    
    // FACOLTATIVO:
    
    public void addVeicoli (List <Veicolo> altriVeicoli) {
       veicoli.addAll (altriVeicoli);
       // inserisci un fireTableRowsInserted con gli indici corretti
    }
    
    scusa una cosa, stavo riguardando il tuo esempio e non ho capito una cosa
    sul addVeicoli te gli passi una list altri veicoli, ma quella come avevi pensato di crearla? perché io devo ancora decidere cosa fare onestamente.
    usare un unica lista è MOLTO più semplice da gestire, ma chiaramente comporta dei limiti, ossia che avrò sempre veicoli nuovi, usare 2 liste invece mi permette, come da voi suggerito, di salvare tutti i veicoli che creo in una lista e di averne una usa e getta che uso per visualizzare o auto o moto, e che caricherà i veicoli dalla seconda. è questo che prevedeva il tuo esempio?
    (a questo punto mi piacerebbe implementare un checkbox che dice, sostanzialmente, se lavora con una sola lista o se lavora con 2, però ho paura che dopo diventerebbe difficile da gestire, perché se passo dal lavorare con una lista a lavorare con 2, perderò tutti i veicoli del primo metodo, mentre quelli del secondo, credo, continueranno ad accumularsi a ogni switch di modalità quindi mi sembra improponibile come cosa)
    p.s. i metodi add e remove son giusti?
    
    	public void addVeicoli(Veicolo veicolo)
    	{
    		veicoli.add(veicolo);
    		fireTableRowsInserted(veicolo.size()-1, veicoli.size()); 
    	}
    	
    	public void removeVeicoli(int rowIndex)
    	{
    		if (rowIndex < 0 || rowIndex >= veicoli.size ()) return;
    		veicoli.remove(rowIndex);
    		fireTableRowsDeleted(veicoli.size()-1, veicoli.size());
    	}
    
    il firetablepiù che altro, ci ho pensato e mi sembra corretto, visto che questi metodi prevedono l'add e il remove di un veicolo per volta, e che poi vengono loopati nella tabella
  • Re: Jframe jtable

    Bene ho fatto quel discorso degli enum, (ho capito cosa sono, circa, cioè non posso dire di essere un esperto di enum, ma ho capito a cosa servono e come funzionano) ma non son minimamente sicuro del mio codice, (in cui hai in gran parte contribuito te) e dato che voglio farmi dire parole, intanto lo posto qua, se va bene, oltre ad accendere 200 ceri, non so come ti chiami ma farò in modo che nel calendario nazionale ci sia un san Ansharja
    vecchio changerownumber da finire di sistemare, ma spero che gli if siano giusti (dopo averci pensato 5 minuti son arrivato solo a questa soluzione per gli enum, ma a pensarci bene non mi sembra corretta. vabbeh intanto la lascio e mi faccio cazziare, e nel frattempo penso a come sistemare
    
    public void changeRowNumber(int newRowCount)
    		{
    			int oldRowCount = atb.getRowCount();
    			if (newRowCount != oldRowCount)
    			{
    				if (oldRowCount > newRowCount)
    				{
    					while(atb.getRowCount() > newRowCount)
    					atb.removeVeicolo(newRowCount);
    				}
    				else
    				{
    					while(veicoli.size() < rowIndex)
    					{
    						if(DisplayMode.AUTO_ONLY)
    						{
    							//rifare il costruttore di veicolo e automobile
    							//veicoli.add(new Automobile(d.setMarcaAuto(a), d.setModelloAuto(a), d.setTipoAuto(n), d.setPrezzoAuto(n), d.setCavalliAuto(n), d.setMassaAuto(n), d.setCilindrataAuto(n),					 						d.setConsumoAuto(n)));
    						}
    						else if(DisplayMode.MOTO_ONLY)
    						{
    							//rifare il costruttore di veicolo e automobile
    							//veicoli.add(new Moto(d.setMarcaAuto(a), d.setModelloAuto(a), d.setTipoAuto(n), d.setPrezzoAuto(n), d.setCavalliAuto(n), d.setMassaAuto(n), d.setCilindrataAuto(n),					 						d.setConsumoAuto(n)));
    						}
    						else
    						{
    							
    						}
    					}
    				}
    			}
    		}
    
    i radio, però qua ho la vaga idea che in quel checkdisplaymode gli devo passare il e.getsource, altrimenti non fa nulla ahahahaha
    
    JRadioButton auto = new JRadioButton("Auto", true);
    		JRadioButton moto = new JRadioButton("Moto");
    		JRadioButton both = new JRadioButton("Entrambi");
    		auto.setSelected(true);
    		
    		class RadioButtonActionListener implements ActionListener 
    		{
    			@Override
    			public void actionPerformed(ActionEvent e) 
    			{
    				JRadioButton button = (JRadioButton)e.getSource();
    				checkDisplayMode();
    			}
    		}
    
  • Re: Jframe jtable

    Scusa una cosa, (un altro messaggio ancora si)
    stavo ragionando sul tuo codice inerente veicolo e automobile

    Ansharja ha scritto:


    
    public abstract class Veicolo
    {
       // dichiari i campi comuni ...
       
       public Veicolo (String modello, String marca) {
          this.modello = modello;
          this.marca = marca;
       }
    
       public void setModello (String modello) {
          this.modello = modello;
       }
    
       // set corrispondente per marca, piu' i vari get.
    }
    
    public class Automobile
    {
       private int capienzaBagagliaio;
       
       public Automobile (String modello, String marca, int capienzaBagagliaio) {
          super (modello, marca);
          this.capienzaBagagliaio = capienzaBagagliaio;
       }
       
       public void setCapienzaBagagliaio (int capienzaBagagliaio) {
          this.capienzaBagagliaio = capienzaBagagliaio;
       }
    }
    
    quindi per quanto riguarda la mia situazione, io allora avrò il metodo che popola l'array di marche e modelli, poi avrò un metodo che genererà un random e mi ritornerà il valore dell'array corrispondente, e quindi avrò una cosa tipo
    
    new Automobile(selezionaMarca(), SelezionaModello(), ecc ecc)
    giusto?
    oppure sto ancora fraintendendo qualcosa?
  • Re: Jframe jtable

    KuroKami69 ha scritto:


    Sul addVeicoli te gli passi una list altri veicoli, ma quella come avevi pensato di crearla?
    In qualsiasi modo, era solo per dare la possibilità a chi usa il modello di aggiungere elementi da un'altra lista invece che essere costretto ad aggiungerne uno alla volta. Ad esempio se hai già creato la tabella e vuoi aggiungere tutti i veicoli che leggi da un altro file.
    Ma più semplicemente: quando hai 10 righe nella tabella e sullo spinner inserisci 20, al momento tu vuoi aggiungere 10 veicoli, quindi ne crei uno alla volta e lo passi al modello, che dice alla tabella di ridisegnarsi. Ma se sai già di crearne altri dieci, puoi crearti una lista temporanea nel tuo metodo, aggiungerci tutti i dieci veicoli, e poi passare la lista al modello, che così deve aggiornarsi una volta sola.
    E' solo una possibilità, non è fondamentale.

    KuroKami69 ha scritto:


    Usare un unica lista è MOLTO più semplice da gestire, ma chiaramente comporta dei limiti, ossia che avrò sempre veicoli nuovi, usare 2 liste invece mi permette, come da voi suggerito, di salvare tutti i veicoli che creo in una lista e di averne una usa e getta che uso per visualizzare o auto o moto, e che caricherà i veicoli dalla seconda. è questo che prevedeva il tuo esempio?
    Questo era il vecchio consiglio che ti avevo dato per filtrare le righe senza sbatterti con un RowFilter. Ma quel metodo addVeicoli () non ha niente a che fare con questo, ho messo un metodo che accetta una lista di veicoli da aggiungere solo per fare la cosa più velocemente e dare una possibilità in più.

    KuroKami69 ha scritto:


    (A questo punto mi piacerebbe implementare un checkbox che dice, sostanzialmente, se lavora con una sola lista o se lavora con 2, però ho paura che dopo diventerebbe difficile da gestire, perché se passo dal lavorare con una lista a lavorare con 2, perderò tutti i veicoli del primo metodo, mentre quelli del secondo, credo, continueranno ad accumularsi a ogni switch di modalità quindi mi sembra improponibile come cosa)
    Mmh quello che dici qua, soprattutto nella seconda parte, sinceramente non l'ho capito. E non c'è alcun motivo per cui tu debba perdere o aggiungere veicoli in più, mi sa che hai frainteso lo scopo di quella lista come argomento (puoi anche toglierlo quel metodo come dicevo).
    Ma, in quanto al checkbox, mi pare una brutta idea, è il modello che "sa" come i dati sono memorizzati all'interno, quello sì che è compito suo, la classe con i componenti non sa niente di questo, e francamente come opzione non mi pare sia utile, non aggiunge alcuna funzionalità, e non è nemmeno facile da capire per un utente.

    KuroKami69 ha scritto:


    P.S. i metodi add e remove son giusti?
    
    	public void addVeicoli(Veicolo veicolo)
    	{
    		veicoli.add(veicolo);
    		fireTableRowsInserted(veicolo.size()-1, veicoli.size()); 
    	}
    	
    	public void removeVeicoli(int rowIndex)
    	{
    		if (rowIndex < 0 || rowIndex >= veicoli.size ()) return;
    		veicoli.remove(rowIndex);
    		fireTableRowsDeleted(veicoli.size()-1, veicoli.size());
    	}
    
    il firetablepiù che altro, ci ho pensato e mi sembra corretto, visto che questi metodi prevedono l'add e il remove di un veicolo per volta, e che poi vengono loopati nella tabella
    No, il fire non è corretto. Nel primo metodo devi passare gli indici delle nuove righe inserite, inclusi, e visto che aggiungi una sola riga il primo indice deve coincidere con il secondo. Se hai 3 righe ad esempio, e ne aggiungi una quarta, la nuova riga inserita è la quarta, con indice 3. Quindi il fireTableRowsInserted va chiamato con il range [3, 3], perché è la sola riga inserita.
    Per la rimozione vale un discorso simile (se la soluzione non ti viene al volo ti basta prendere carta e penna e farti un esempio con indici di prova per vedere la regola).

    KuroKami69 ha scritto:


    
    public void changeRowNumber(int newRowCount)
    		{
    			int oldRowCount = atb.getRowCount();
    			if (newRowCount != oldRowCount)
    			{
    				if (oldRowCount > newRowCount)
    				{
    					while(atb.getRowCount() > newRowCount)
    					atb.removeVeicolo(newRowCount);
    				}
    				else
    				{
    					while(veicoli.size() < rowIndex)
    					{
    						if(DisplayMode.AUTO_ONLY)
    						{
    							//rifare il costruttore di veicolo e automobile
    							//veicoli.add(new Automobile(d.setMarcaAuto(a), d.setModelloAuto(a), d.setTipoAuto(n), d.setPrezzoAuto(n), d.setCavalliAuto(n), d.setMassaAuto(n), d.setCilindrataAuto(n),					 						d.setConsumoAuto(n)));
    						}
    						else if(DisplayMode.MOTO_ONLY)
    						{
    							//rifare il costruttore di veicolo e automobile
    							//veicoli.add(new Moto(d.setMarcaAuto(a), d.setModelloAuto(a), d.setTipoAuto(n), d.setPrezzoAuto(n), d.setCavalliAuto(n), d.setMassaAuto(n), d.setCilindrataAuto(n),					 						d.setConsumoAuto(n)));
    						}
    						else
    						{
    							
    						}
    					}
    				}
    			}
    		}
    
    Beh non è che sia un granché sistemato il codice no? Hai commentato le vecchie parti dove crei i veicoli, che come detto vanno totalmente cambiate.
    Inoltre non sei più dentro il TableModel (per fortuna), quindi non hai più accesso a veicoli, non lo devi proprio usare.

    La parte dove rimuovi i veicoli va bene. Poi al posto di veicoli.size () devi chiedere come sopra al modello il numero di righe. E anche l'if con le modalità non è corretto. Non è un boolean, non puoi fare if (valore), sarebbe come scrivere if (3).

    Devi fare un confronto: prendi la modalità di visualizzazione "corrente" della tabella, e la confronti con == con i vari elementi della enum.
    O usi il metodo che ti ho scritto io, quel checkDisplayMode (che ritorna la modalità impostata in base a quale radiobutton è selezionato), ed assegni il risultato del metodo a una variabile per poi fare il confronto, o chiedi la modalità direttamente al modello, a patto che tu la aggiorni all'interno del modello ad ogni modifica (ti avevo suggerito di usare un setDisplayMode nel modello a riguardo).

    KuroKami69 ha scritto:


    I radio, però qua ho la vaga idea che in quel checkdisplaymode gli devo passare il e.getsource, altrimenti non fa nulla ahahahaha
    
    JRadioButton auto = new JRadioButton("Auto", true);
    		JRadioButton moto = new JRadioButton("Moto");
    		JRadioButton both = new JRadioButton("Entrambi");
    		auto.setSelected(true);
    		
    		class RadioButtonActionListener implements ActionListener 
    		{
    			@Override
    			public void actionPerformed(ActionEvent e) 
    			{
    				JRadioButton button = (JRadioButton)e.getSource();
    				checkDisplayMode();
    			}
    		}
    
    No, non è questo il modo in cui va usato quel metodo. Se vuoi implementare un listener sui radiobutton, quando ricevi un evento devi controllare quale radio button è selezionato, e in base a quello setti al modello la modalità di visualizzazione corretta. Usare così il checkDisplayMode () non serve a nulla, non viene assegnato a niente il risultato.

    E il getSource () non ti risolve nulla, lascia stare, usa sempre isSelected () per controllare quale dei radiobutton è selezionato.

    KuroKami69 ha scritto:


    [...]
    Io allora avrò il metodo che popola l'array di marche e modelli, poi avrò un metodo che genererà un random e mi ritornerà il valore dell'array corrispondente, e quindi avrò una cosa tipo
    
    new Automobile(selezionaMarca(), SelezionaModello(), ecc ecc)
    giusto?
    oppure sto ancora fraintendendo qualcosa?
    Meglio la lista rispetto all'array, lo abbiamo già detto, con la lista sai sempre quanti elementi hai all'interno, ed è anche più comoda da gestire per l'inserimento quando non sai a priori quanti oggetti dovrà contentere.

    Il resto tecnicamente è corretto, ma non so se hai capito dove vanno inseriti quei metodi selezionaMarca () etc. Quei metodi devono essere nella classe CostruttoreVeicoli (o come vuoi chiamarla) che è l'unica ad avere le liste e che può quindi prenderne un elemento (anche a caso) all'interno.
    Ma avere un metodo per ogni selezione mi pare eccessivo, ti basta una riga di codice. Se hai la lista di modelli definita come List <String> modelliAuto, per prenderne un elemento casuale ti basta scrivere:
    
    String modello = modelliAuto.get (random.nextInt (modelliAuto.size ()));
    // qui puoi passare modello e tutte le altre variabili al costruttore di Automobile
    
    Come vedi è molto più semplice rispetto a scrivere un metodo per ogni attributo, avresti un codice infinito (non che sia poco per ora, ma è inevitabile se vuoi avere tutti quei dati).
    L'importante è che modelliAuto sia riempita nel costruttore (leggendo da file, ad esempio) e che random sia un oggetto Random anch'esso costruito solo alla creazione della tua istanza (non ha senso averne più di uno).
  • Re: Jframe jtable

    Ansharja ha scritto:


    KuroKami69 ha scritto:


    Sul addVeicoli te gli passi una list altri veicoli, ma quella come avevi pensato di crearla?
    In qualsiasi modo, era solo per dare la possibilità a chi usa il modello di aggiungere elementi da un'altra lista invece che essere costretto ad aggiungerne uno alla volta. Ad esempio se hai già creato la tabella e vuoi aggiungere tutti i veicoli che leggi da un altro file.
    Ma più semplicemente: quando hai 10 righe nella tabella e sullo spinner inserisci 20, al momento tu vuoi aggiungere 10 veicoli, quindi ne crei uno alla volta e lo passi al modello, che dice alla tabella di ridisegnarsi. Ma se sai già di crearne altri dieci, puoi crearti una lista temporanea nel tuo metodo, aggiungerci tutti i dieci veicoli, e poi passare la lista al modello, che così deve aggiornarsi una volta sola.
    E' solo una possibilità, non è fondamentale.
    ho capito, in verità ho capito che non ho le idee chiare su come gestire 2 liste parallelamente, a livello di codice, quindi userò una sola lista lista che si cancellerà ogni volta, e per quanto brutto possa essere, quando dovrò aggiungere entrambi farò un bel while che richiama inserisce i mezzo a cascata, poi faccio un if(spinnerValue % 2 != 0) veicoli.remove(lastindex) (che è SEMPRE una moto, in quanto decido di inserire prima le auto), poco raffinato ma dovrebbe funzionare no?

    Ansharja ha scritto:


    KuroKami69 ha scritto:


    Usare un unica lista è MOLTO più semplice da gestire, ma chiaramente comporta dei limiti, ossia che avrò sempre veicoli nuovi, usare 2 liste invece mi permette, come da voi suggerito, di salvare tutti i veicoli che creo in una lista e di averne una usa e getta che uso per visualizzare o auto o moto, e che caricherà i veicoli dalla seconda. è questo che prevedeva il tuo esempio?
    Questo era il vecchio consiglio che ti avevo dato per filtrare le righe senza sbatterti con un RowFilter. Ma quel metodo addVeicoli () non ha niente a che fare con questo, ho messo un metodo che accetta una lista di veicoli da aggiungere solo per fare la cosa più velocemente e dare una possibilità in più.

    KuroKami69 ha scritto:


    (A questo punto mi piacerebbe implementare un checkbox che dice, sostanzialmente, se lavora con una sola lista o se lavora con 2, però ho paura che dopo diventerebbe difficile da gestire, perché se passo dal lavorare con una lista a lavorare con 2, perderò tutti i veicoli del primo metodo, mentre quelli del secondo, credo, continueranno ad accumularsi a ogni switch di modalità quindi mi sembra improponibile come cosa)
    Mmh quello che dici qua, soprattutto nella seconda parte, sinceramente non l'ho capito. E non c'è alcun motivo per cui tu debba perdere o aggiungere veicoli in più, mi sa che hai frainteso lo scopo di quella lista come argomento (puoi anche toglierlo quel metodo come dicevo).
    Ma, in quanto al checkbox, mi pare una brutta idea, è il modello che "sa" come i dati sono memorizzati all'interno, quello sì che è compito suo, la classe con i componenti non sa niente di questo, e francamente come opzione non mi pare sia utile, non aggiunge alcuna funzionalità, e non è nemmeno facile da capire per un utente.[/quote dimentica questa parte che è meglio ahahah

    Ansharja ha scritto:


    KuroKami69 ha scritto:


    P.S. i metodi add e remove son giusti?
    
    	public void addVeicoli(Veicolo veicolo)
    	{
    		veicoli.add(veicolo);
    		fireTableRowsInserted(veicolo.size()-1, veicoli.size()); 
    	}
    	
    	public void removeVeicoli(int rowIndex)
    	{
    		if (rowIndex < 0 || rowIndex >= veicoli.size ()) return;
    		veicoli.remove(rowIndex);
    		fireTableRowsDeleted(veicoli.size()-1, veicoli.size());
    	}
    
    il firetablepiù che altro, ci ho pensato e mi sembra corretto, visto che questi metodi prevedono l'add e il remove di un veicolo per volta, e che poi vengono loopati nella tabella
    No, il fire non è corretto. Nel primo metodo devi passare gli indici delle nuove righe inserite, inclusi, e visto che aggiungi una sola riga il primo indice deve coincidere con il secondo. Se hai 3 righe ad esempio, e ne aggiungi una quarta, la nuova riga inserita è la quarta, con indice 3. Quindi il fireTableRowsInserted va chiamato con il range [3, 3], perché è la sola riga inserita.
    Per la rimozione vale un discorso simile (se la soluzione non ti viene al volo ti basta prendere carta e penna e farti un esempio con indici di prova per vedere la regola).
    si ci avevo ragionato giusto fino alla fine, poi ho sfasato pensando che i 2 valori fossero differenti, nonostante fossi giunto alla conclusione che erano gli stessi. ad ogni modo...

    Ansharja ha scritto:


    KuroKami69 ha scritto:


    
    public void changeRowNumber(int newRowCount)
    		{
    			int oldRowCount = atb.getRowCount();
    			if (newRowCount != oldRowCount)
    			{
    				if (oldRowCount > newRowCount)
    				{
    					while(atb.getRowCount() > newRowCount)
    					atb.removeVeicolo(newRowCount);
    				}
    				else
    				{
    					while(veicoli.size() < rowIndex)
    					{
    						if(DisplayMode.AUTO_ONLY)
    						{
    							//rifare il costruttore di veicolo e automobile
    							//veicoli.add(new Automobile(d.setMarcaAuto(a), d.setModelloAuto(a), d.setTipoAuto(n), d.setPrezzoAuto(n), d.setCavalliAuto(n), d.setMassaAuto(n), d.setCilindrataAuto(n),					 						d.setConsumoAuto(n)));
    						}
    						else if(DisplayMode.MOTO_ONLY)
    						{
    							//rifare il costruttore di veicolo e automobile
    							//veicoli.add(new Moto(d.setMarcaAuto(a), d.setModelloAuto(a), d.setTipoAuto(n), d.setPrezzoAuto(n), d.setCavalliAuto(n), d.setMassaAuto(n), d.setCilindrataAuto(n),					 						d.setConsumoAuto(n)));
    						}
    						else
    						{
    							
    						}
    					}
    				}
    			}
    		}
    
    Beh non è che sia un granché sistemato il codice no? Hai commentato le vecchie parti dove crei i veicoli, che come detto vanno totalmente cambiate.
    Inoltre non sei più dentro il TableModel (per fortuna), quindi non hai più accesso a veicoli, non lo devi proprio usare.

    La parte dove rimuovi i veicoli va bene. Poi al posto di veicoli.size () devi chiedere come sopra al modello il numero di righe. E anche l'if con le modalità non è corretto. Non è un boolean, non puoi fare if (valore), sarebbe come scrivere if (3).

    Devi fare un confronto: prendi la modalità di visualizzazione "corrente" della tabella, e la confronti con == con i vari elementi della enum.
    O usi il metodo che ti ho scritto io, quel checkDisplayMode (che ritorna la modalità impostata in base a quale radiobutton è selezionato), ed assegni il risultato del metodo a una variabile per poi fare il confronto, o chiedi la modalità direttamente al modello, a patto che tu la aggiorni all'interno del modello ad ogni modifica (ti avevo suggerito di usare un setDisplayMode nel modello a riguardo).
    ok qua
    1) è sistemato, mi ero dimenticato di togliere veicoli.size() prima di postare, è apposto ora
    2) ho commentato quella roba solo per ricordarmi cosa fare, poi appena sistemo auto e veicolo li rimuovo i commenti
    3) all'inizio avevo fatto un if(checkDisplayMode() == AUTO_ONLY) ecc, poi ci ho pensato e mi son detto "ok forse è sbagliato" e ho messo così. ma credo fosse giusto come avevo fatto all'inizio, senza richiamare il metodo nel listener del radio

    Ansharja ha scritto:


    KuroKami69 ha scritto:


    I radio, però qua ho la vaga idea che in quel checkdisplaymode gli devo passare il e.getsource, altrimenti non fa nulla ahahahaha
    
    JRadioButton auto = new JRadioButton("Auto", true);
    		JRadioButton moto = new JRadioButton("Moto");
    		JRadioButton both = new JRadioButton("Entrambi");
    		auto.setSelected(true);
    		
    		class RadioButtonActionListener implements ActionListener 
    		{
    			@Override
    			public void actionPerformed(ActionEvent e) 
    			{
    				JRadioButton button = (JRadioButton)e.getSource();
    				checkDisplayMode();
    			}
    		}
    
    No, non è questo il modo in cui va usato quel metodo. Se vuoi implementare un listener sui radiobutton, quando ricevi un evento devi controllare quale radio button è selezionato, e in base a quello setti al modello la modalità di visualizzazione corretta. Usare così il checkDisplayMode () non serve a nulla, non viene assegnato a niente il risultato.

    E il getSource () non ti risolve nulla, lascia stare, usa sempre isSelected () per controllare quale dei radiobutton è selezionato.
    come sopra

    Ansharja ha scritto:


    KuroKami69 ha scritto:


    [...]
    Io allora avrò il metodo che popola l'array di marche e modelli, poi avrò un metodo che genererà un random e mi ritornerà il valore dell'array corrispondente, e quindi avrò una cosa tipo
    
    new Automobile(selezionaMarca(), SelezionaModello(), ecc ecc)
    giusto?
    oppure sto ancora fraintendendo qualcosa?
    Meglio la lista rispetto all'array, lo abbiamo già detto, con la lista sai sempre quanti elementi hai all'interno, ed è anche più comoda da gestire per l'inserimento quando non sai a priori quanti oggetti dovrà contentere.

    si, devo ancora cambiare quindi sto ancora dicendo array. volevo dire lista

    Ansharja ha scritto:


    Il resto tecnicamente è corretto, ma non so se hai capito dove vanno inseriti quei metodi selezionaMarca () etc. Quei metodi devono essere nella classe CostruttoreVeicoli (o come vuoi chiamarla) che è l'unica ad avere le liste e che può quindi prenderne un elemento (anche a caso) all'interno.
    Ma avere un metodo per ogni selezione mi pare eccessivo, ti basta una riga di codice. Se hai la lista di modelli definita come List <String> modelliAuto, per prenderne un elemento casuale ti basta scrivere:
    
    String modello = modelliAuto.get (random.nextInt (modelliAuto.size ()));
    // qui puoi passare modello e tutte le altre variabili al costruttore di Automobile
    
    Come vedi è molto più semplice rispetto a scrivere un metodo per ogni attributo, avresti un codice infinito (non che sia poco per ora, ma è inevitabile se vuoi avere tutti quei dati).
    L'importante è che modelliAuto sia riempita nel costruttore (leggendo da file, ad esempio) e che random sia un oggetto Random anch'esso costruito solo alla creazione della tua istanza (non ha senso averne più di uno).
    per costruttoreVeicoli intendi la mia classe DataFile, dove creo le liste (dopo la modifica) con le letture da file? quindi per ricapitolare.
    forse a questo punto ho un attimo di confusione (si lo so sono lento) ma
    nel costruttore di veicolo io faccio le assegnazioni con valori presi dal costruttore di automobile, fino a qui ci sono ma continuo a non capire il discorso dei set
    il set serve SOLO a impostare un valore per un attributo.
    no niente. mi perdo. non mi trovo. poi a me quel numero random serve averlo salvato per poter abbinare la marca, e idem con la tipologia che poi deve abbinare gli elementi delle altre liste. niente mi sto perdendo... devo mettere su carta ste cose o non ce la faccio
  • Re: Jframe jtable

    @KuroKami69: avrei voluto usare il mio post n.3000 (wow già tremila messaggi in circa 4 anni ) per qualcosa di più interessante tecnicamente parlando.
    Ma a questo punto lo uso per chiederti: fino a dove/quando vuoi andare avanti così?

    Mi spiego: questa discussione ha già 200+ messaggi, 1100+ visite. Stai impegnando risorse "tecniche" del forum (spazio DB, banda e quant'altro), stai impegnando persone (sicuramente io e @Ansharja che ti stiamo seguendo, lui di recente di più di me, io in questi giorni ho altre questioni "lavorative" più importanti) e chi altri non so che ha avuto la pazienza di leggere la discussione.
    E mi pare che sei un po' lontato dal risultato finale. E tutte o quasi le tue risposte sono del tipo: "continuo a NON capire" ... "questa parte non l'ho ben capita" ... "son sempre in alto mare" ... "non ho le idee chiare" ... "mi perdo. non mi trovo" ... "devo mettere su carta ste cose o non ce la faccio" o del tipo faccio così e succede cosà ... quello lì non funziona ... ecc...

    Vuoi che stiamo fino a metà Dicembre o peggio fino a Natale a spiegarti dove mettere quel if, quella assegnazione, quella lista, quel fireXYZ, ecc...??
    Onestamente non mi pare un uso "buono" del forum. Stai davvero solamente "giocherellando" con Java nel senso letterale della parola.

    Non che sia sbagliato ogni tanto giocherellare. Anche io a volte giocherello con framework/librerie che non conosco, di recente ho "giocherellato" (=sperimentato) un po' con Spring Boot che poi mi è servito davvero per un progetto reale di lavoro. Ma io ho conoscenze su tutto Java ultra-solidissime (con anni/certificazioni alle spalle) e quindi "posso" giocherellare su quello che mi pare ..

    Quindi accetta un consiglio onesto e sincero: ACCANTONA, metti da parte questo progettino; PRENDI in mano quel bel LIBRO che hai detto di aver già preso; INIZIA a STUDIARE sul serio Java partendo dalle BASI.

    Altrimenti non so proprio come potrai andare avanti così ....
  • Re: Jframe jtable

    @andbin mi sembra il classico rimprovero che si fa a un bambino piccolo, ma hai ragione. proverò a fare tutto quello che devo fare nei prossimi giorni, e se tutto va bene per domenica dovrei avere il risultato finale, anche se sono abbastanza sicuro che non sarà proprio come farebbe un programmatore esperto. il fatto è che se lo accantono ora, poi quando inizio a studiare mi vengono mille pensieri in testa, del tipo "ok ma forse questo lo posso applicare di la in questo modo" e non finisce più. non che magari sia sbagliato ma va a finire che ci metto il doppio del tempo
  • Re: Jframe jtable

    KuroKami69 ha scritto:


    @andbin mi sembra il classico rimprovero che si fa a un bambino piccolo
    Non era un "rimprovero", nè tanto meno "da bambini". Avrei detto la stessa cosa a chiunque altro (non solo perché sei tu) se dopo settimane (è passato quasi 1 mese dall'inizio della discussione!) e dopo decine e decine di messaggi continuasse a dire che non riesce/non capisce/non si trova/si perde/ecc...
    Non è questione di scarsa volontà, anzi, si vede che VUOI fare le cose e imparare. Ma la volontà da sola non basta, serve lo studio e la applicazione (di ciò che si è studiato). Altrimenti continui a confonderti e probabilmente ancora di più se tu o altri mettono altra "carne al fuoco" nei messaggi.
    Per dire: ti è stato indicato (da Ansharja) l'uso delle enum. Probabilmente hai solo "intuito" l'utilità delle enum. Ma in Java le enum sono un tipo di classe molto "speciale" e con parecchie sfaccettature anche "fini", che sicuramente non conosci.

    Sono sicuro che se partissi bene dall'inizio cioè dalle basi, con un buon libro e con il supporto mio (e di altri) sul forum, riusciresti a comprendere bene teoria, regole e concetti di Java. E a quel punto non solo saresti più autonomo ma alla fine "ti piacerebbe" anche come linguaggio.

    P.S. tra l'altro in questi ultimi giorni non ho potuto seguire molto la discussione sul piano tecnico, vedo che Ansharja ti ha spiegato molto e con messaggi anche lunghi. Io invece ho perso un po' il "filo" del discorso ... dovrei rileggermi 2 o più pagine della discussione per riprendere e capire a che punto sei arrivato. Ecco la questione che dicevo prima: discussioni così lunghe fanno perdere il "filo" anche a NOI che le cose le sappiamo!
  • Re: Jframe jtable

    Non l'ho detto con risentimento, anzi, era ironica la mia frase.
    comunque ho perso anche io il filo del discorso, ogni volta mi rileggo sempre i messaggi ahahaha
    hai ragione, dovrei proprio iniziarlo il libro, difatti ho capito le enum ma non tutti i possibili utilizzi/sfaccettature che possono avere
    onestamente se il codice continuava a rimanere "rozzo" probabilmente ora lo avrei finito. certo sarebbe stato pieno di schifezze ma, sarebbe sempre servito da esempio. se per esempio lo mostrassi al mio prof di Sistemi e reti, lui lo guarderebbe tutto, e mi direbbe ogni singolo punto che ho sbagliato, e mi farebbe un documento con scritte queste cose e cosa migliorare e perché. che è quello che avete fatto voi fino ad ora, ma il punto è che con voi lo sto correggendo piano piano e imparo poco alla volta, perdendo varie volte la testa e il controllo della situazione (difatti ora che sto usando le liste su datafile, anziché gli array, leggo da file e ciclo, mi fa solo 1 giro e poi mi da nullpointerexception, ma non capisco perché. ma non importa), con il documento del mio prof avrei una panoramica generale molto più chiara da poter raffrontare al codice
  • Re: Jframe jtable

    Domandina:
    secondo voi questo metodo per gestire le colonne, riesco a usarlo? ora che miracolosamente funziona tutto, fino al cambio di veicolo, che intanto proverò a fare come si era detto (anche se con tutti questi messaggi ho perso il punto) dopodiché proverò a implementare questo medoto
    p.s. non è che potreste darmi una vaga indicazione di dove chiamare il removeAll per pulire la lista? dopo ben mezzora passata a provare anche le cose più stupide, ho esaurito le idee
    @EDIT:
    ok rileggendo ora mi son reso conto di aver fatto 20mila set per niente. magari domani lo correggo
  • Re: Jframe jtable

    Bene, tralasciando ampiamente l'eleganza del codice, sono sicuro che si potrebbe migliorare MA non so come, e dato che ormai mancano solo 2 cose, lo voglio finire
    quindi ora ho il medoto getValueAt che è così:
    
    @Override
    	public Object getValueAt(int rowIndex, int columnIndex)
    	{
    		Veicolo veicolo = (Veicolo)veicoli.get(rowIndex);
    		switch(columnIndex)
    		{
    			case 0: return veicolo.getMarca();
    			case 1: return veicolo.getModello();
    			case 2: return veicolo.getStato();
    			case 3: return veicolo.getPrezzo();
    			case 4: return veicolo.getTipo();
    			case 5: return veicolo.getColore();
    			case 6: return veicolo.getKm();
    			case 7: return veicolo.getAnnoImmatricolazione();
    			case 8: return veicolo.getScadenzaBollo();
    			case 9: return veicolo.getTarga();
    			
    			case 10: if(mode.equals("auto"))
    						{
    							Automobile automobile = (Automobile)veicoli.get(rowIndex);
    							return automobile.getPosti();
    						}
    						else return "/";
    			
    			case 11: if(mode.equals("auto"))
    						{
    							Automobile automobile = (Automobile)veicoli.get(rowIndex);
    							return automobile.getPortiere();
    						}
    						else return "/";
    			
    			case 12: if(mode.equals("auto"))
    						{
    							Automobile automobile = (Automobile)veicoli.get(rowIndex); 
    							return automobile.getBagagliaio();
    						}
    						else return "/";
    						
    			case 13: return veicolo.getCilindrata();
    			case 14: return veicolo.getCilindri();
    						
    			case 15: if (c == false) return veicolo.getCavalli();
    					 else return veicolo.conversioneCK(veicolo.getCavalli());
    				
    			case 16: return veicolo.getRapportoPP();
    			case 17: return veicolo.getMotore();
    			case 18: return veicolo.getConsumo();
    			
    			case 19: if(mode.equals("auto"))
    						{
    							Automobile automobile = (Automobile)veicoli.get(rowIndex); 
    							return automobile.getTrazione();
    						}
    						else return "/";
    						
    			case 20: return veicolo.getCambio();
    			case 21: return veicolo.getMarce();
    			
    			case 22: if(mode.equals("auto"))
    						{
    							Automobile automobile = (Automobile)veicoli.get(rowIndex); 
    							return automobile.getLunghezza();
    						}
    						else return "/";
    						
    			case 23: return veicolo.getMassaVuoto();
    			
    			case 24: if(mode.equals("auto"))
    						{
    							Automobile automobile = (Automobile)veicoli.get(rowIndex);
    							return automobile.getAltezzaTerra();
    						}
    						else return "/";
    						
    			case 25: if(mode.equals("auto"))
    						{
    							Automobile automobile = (Automobile)veicoli.get(rowIndex);
    							return automobile.getTettuccio();
    						}
    						else if(mode.equals("moto"))
    						{
    							Moto moto = (Moto)veicoli.get(rowIndex);
    							return moto.getParabrezza();
    						}	
    						else return "/";
    						
    			default: return null;
    		}
    	}
    
    (non ho capito come fare il casting di veicolo ad auto/moto quindi mi sono arrangiato in questo modo, forse alquanto osceno)
    ora, quando imposto il button su entrambi, e scrollo orizzontalmente, mi va in bug la grafica, posto uno screen. perché questo?
    visto che non si vede tutto nell'immagine, posto anche l'eccezione
    
    Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Cannot format given Object as a Number
            at java.text.DecimalFormat.format(Unknown Source)
            at java.text.Format.format(Unknown Source)
            at javax.swing.JTable$DoubleRenderer.setValue(Unknown Source)
            at javax.swing.table.DefaultTableCellRenderer.getTableCellRendererComponent(Unknown Source)
            at javax.swing.JTable.prepareRenderer(Unknown Source)
            at javax.swing.plaf.basic.BasicTableUI.paintCell(Unknown Source)
            at javax.swing.plaf.basic.BasicTableUI.paintCells(Unknown Source)
            at javax.swing.plaf.basic.BasicTableUI.paint(Unknown Source)
            at javax.swing.plaf.ComponentUI.update(Unknown Source)
            at javax.swing.JComponent.paintComponent(Unknown Source)
            at javax.swing.JComponent.paint(Unknown Source)
            at javax.swing.JComponent.paintChildren(Unknown Source)
            at javax.swing.JComponent.paint(Unknown Source)
            at javax.swing.JViewport.paint(Unknown Source)
            at javax.swing.JComponent.paintChildren(Unknown Source)
            at javax.swing.JComponent.paint(Unknown Source)
            at javax.swing.JComponent.paintToOffscreen(Unknown Source)
            at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(Unknown Source)
            at javax.swing.RepaintManager$PaintManager.paint(Unknown Source)
            at javax.swing.RepaintManager.paint(Unknown Source)
            at javax.swing.JComponent._paintImmediately(Unknown Source)
            at javax.swing.JComponent.paintImmediately(Unknown Source)
            at javax.swing.RepaintManager$4.run(Unknown Source)
            at javax.swing.RepaintManager$4.run(Unknown Source)
            at java.security.AccessController.doPrivileged(Native Method)
            at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
            at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
            at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
            at javax.swing.RepaintManager.prePaintDirtyRegions(Unknown Source)
            at javax.swing.RepaintManager.access$1200(Unknown Source)
            at javax.swing.RepaintManager$ProcessingRunnable.run(Unknown Source)
            at java.awt.event.InvocationEvent.dispatch(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.doIntersectionPrivilege(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)
    
    

    Allegati:
    22492_343644e48b8c9f39d8a2bbcf7fa9fdc5.jpg
    22492_343644e48b8c9f39d8a2bbcf7fa9fdc5.jpg
  • Re: Jframe jtable

    KuroKami69 ha scritto:


    Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Cannot format given Object as a Number
    at java.text.DecimalFormat.format(Unknown Source)
    at java.text.Format.format(Unknown Source)
    at javax.swing.JTable$DoubleRenderer.setValue(Unknown Source)
    at javax.swing.table.DefaultTableCellRenderer.getTableCellRendererComponent(Unknown Source)
    at javax.swing.JTable.prepareRenderer(Unknown Source)
    at javax.swing.plaf.basic.BasicTableUI.paintCell(Unknown Source)
    at javax.swing.plaf.basic.BasicTableUI.paintCells(Unknown Source)
    at javax.swing.plaf.basic.BasicTableUI.paint(Unknown Source)
    Dovresti anche "imparare" a leggere lo stack trace. Guarda il punto che ho segnato in rosso. Lì è in un renderer, ovvero sta preparando il componente che verrà letteralmente "stampato" nella cella. Ma nota, il renderer è per un tipo Double.

    Vuol dire che per una certa colonna x hai esposto come tipo Double.class (per cui JTable effettivamente sceglie un suo DoubleRenderer) ma poi al getValueAt hai tirato fuori qualcos'altro, ad esempio una stringa (es. quei "/" che si vedono nel codice). Ovviamente NON può funzionare in quanto quel renderer formatta il Object usando un NumberFormat (DecimalFormat) che si aspetta un oggetto che sia un numero.

    KuroKami69 ha scritto:


    e dato che ormai mancano solo 2 cose, lo voglio finire
    Si, per favore, finiscilo.
Devi accedere o registrarti per scrivere nel forum
230 risposte