Jframe jtable

di il
230 risposte

230 Risposte - Pagina 11

  • Re: Jframe jtable

    KuroKami69 ha scritto:


    Effettivamente non ha senso
    quindi vuoi dire che la mia sottoclasse avrà solo il costruttore?
    Se deve passare "qualcosa" ad un costruttore della super-classe, allora certo che deve avere un costruttore esplicito.

    Qualunque altra cosa che metti è "in più" (a meno di metodi in override che modificano il comportamento di un metodo già esistente nella super-classe)
  • Re: Jframe jtable

    Eh ok ma forse mi son perso un pezzo io, ma il metodo costruttore di automobili, che mi crea la mia auto, lo devo fare nella sottoclasse automobili no? cioè non lo posso fare nel costruttore.
    te mi stai dicendo che è il costruttore di veicoli a crearmi automobile?
  • Re: Jframe jtable

    Comunque mi dispiace dirlo, ma non mi è chiaro come fare il discorso di scegliere cosa visualizzare...
    nel tablemodel ho dichiarato una variabile "visualizza" che prenderà il valore tramite il metodo show() a cui passo il parametro del jradiobutton
    e fin qua credo sia giusto (non capisco perché anche se ho messo auto come default, non me assegna all'avvio del programma)
    ma poi non capisco come fare
    concettualmente si, su codice no.
  • Re: Jframe jtable

    KuroKami69 ha scritto:


    Eh ok ma forse mi son perso un pezzo io, ma il metodo costruttore di automobili, che mi crea la mia auto, lo devo fare nella sottoclasse automobili no? cioè non lo posso fare nel costruttore.
    te mi stai dicendo che è il costruttore di veicoli a crearmi automobile?
    No. Purtroppo non hai affatto le "basi" su Java su queste cose. Ma lo capisco .. (cioè, si vede).

    Se in Veicolo c'è es. solo 1 (UNO!) costruttore tipo:

    public Veicolo(String targa)

    allora le sotto-classi DEVONO avere un costruttore esplicito per passare la targa al super-costruttore.
  • Re: Jframe jtable

    Eh ok ma la mia superclasse non ha metodi costruttori
  • Re: Jframe jtable

    KuroKami69 ha scritto:


    Eh ok ma la mia superclasse non ha metodi costruttori
    Io ti ho detto un concetto in generale. Le regole NON le conosci bene.
    Se la tua super-classe non ha un costruttore esplicito ... ha quello di default, che è senza argomenti. Nelle sotto-classi quindi puoi non avere un costruttore o averne che ricevono dei dati per solo scopo della sotto-classe. Ma non devi appunto "passare" nulla ad un super-costruttore.
  • Re: Jframe jtable

    Giusto, mi era passato di mente che se non lo si crea viene usato quello di default senza argomenti. e dire che la prof lo ripete spesso
    dopo aver letto 4-5 volte quello che hai scritto credo di aver capito
    ad ogni modo...
    per fare quello che ho in mente, di mostrare solo auto o solo moto o entrambi, devo riarrangiare questo metodo giusto?
    
    public void changeRowNumber(int rowIndex)
    	{
    		int size = automobili.size();
    		if (!(automobili.size() == rowIndex))
    		{
    			if (automobili.size() > rowIndex)
    			{
    				while(automobili.size() > rowIndex)
    				automobili.remove(rowIndex);
    				fireTableRowsDeleted(automobili.size()-1, size-1);
    			}
    			else
    			{
    				while(automobili.size() < rowIndex)
    				automobili.add(new Automobili());
    				fireTableRowsInserted(size, rowIndex-1);
    			}
    		}
    	}
    
  • Re: Jframe jtable

    KuroKami69 ha scritto:


    Per fare quello che ho in mente, di mostrare solo auto o solo moto o entrambi, devo riarrangiare questo metodo giusto?
    
    public void changeRowNumber(int rowIndex)
    	{
    		[...]
    	}
    
    Di per sé no, non c'entra nulla. Questo è un metodo (abbastanza particolare, l'ho già detto) che ti sei inventato tu per aggiungere/rimuovere righe della tabella in base al valore dello spinner, non mischiare le cose inutilmente.

    Hai solo bisogno di qualcosa all'interno del table model che mantenga lo "stato" logico di quello che stai visualizzando, e un metodo per cambiarlo all'occorrenza. Devi semplicemente usare una o più variabili quindi, e un set per ogni variabile per modificarle.

    Il metodo più semplice e logico a mio parere è usare due valori booleani, es. showAuto e showMoto, e fornire dei set per modificarli dall'esterno.
    Se usassi due JCheckbox (che era il mio suggerimento all'inizio della discussione) basterebbe che ad ogni volta che togli/metti la spunta richiami un tableModel.setShowAuto (/* valore del checkbox */); o simili.

    Poi nel tableModel a questi set colleghi un metodo es. filtraRighe (), che richiami quando cambia qualcosa da visualizzare, e che svuota la lista e la ripopola in base a showAuto/showMoto e al tipo di veicolo che legge dalla lista "completa".

    Questo è solo un modo, non è l'unico, potresti anche usare una Enum per gestire i possibili valori della visualizzazione (solo moto, solo auto, entrambe, purtroppo dovresti sempre controllare di non aver ricevuto null nel metodo), meglio rispetto a una stringa o un int (che non hanno un range di valori fisso, dovresti controllare ogni volta la validità, e dall'esterno sarebbe utile poter richiamare al limite delle costanti nella classe, come si fa ad esempio per BorderLayout.NORTH o JLabel.CENTER o molto altro in swing).
  • Re: Jframe jtable

    Si ma il raqdiobutton da più l'idea di scelta ecco. il checkbox mi da più l'idea di accettazione o meno, e nel caso della conversione, un check era d'obbligo tutto qua.
    anche se mi hai dato questa dritta, purtroppo nella mia ignoranza non riesco a vedere il quadro generale di come dovrebbe uscire.
    mettiamo anche che io passi dei booleani alle variabili showAuto e showMoto e che il valore ne viene modificato alla modifica dello stato del button.
    poi devo avere un metodo che a seconda dello stato degli show, mi sistema la lista.
    grosso modo ci ero arrivato arrangiando il mio metodo, aggiungendo degli if (visualizza.equals("auto")) allora mi addi le auto, se invece è "moto" allora mi addi le moto, se è entrambi, me li addi entrambi, e nonostante la poca raffinatezza sono abbastanza sicuro sul suo funzionamento
    non riesco a capire come gestire il getValueAt, voglio dire questa parte di codice qua, che credevo di aver capito, forse non mi è così chiara come pensavo
    
    Automobili automobile = (Automobili)automobili.get(rowIndex);
    
    io qua creo l'oggetto automobile, di tipo automobili, gli faccio un casting (mi pare si chiami così) e gli dico di prendere il metodo che decido poi nello switch sotto
    giusto?
    o ho capito male io?
  • Re: Jframe jtable

    Innanzitutto nel getValueAt (come anche nel getRowCount) invece di "automobili" useresti la lista già filtrata, se segui il mio suggerimento.
    Il modello espone alla tabella solo ciò che è visibile in quel momento, quando la situazione cambia si riaggiorna da solo.

    Il come prendere le informazioni è da vedere. Quali colonne vuoi mostrare per auto e moto? Sta tutto qui.

    Se vuoi vedere esattamente le stesse informazioni, allora tutti i metodi di cui hai bisogno dovrebbero già essere nella superclasse, quindi non sarebbe necessario il cast ad automobile o moto. A quel punto però io mi chiederei anche se sia necessario avere due sottoclassi, cosa aggiungerebbe al programma se usi solo la tabella? Magari andrebbe bene anche solo Veicolo con un attributo tipologia che mostri nella tabella, con valore "auto" o "moto" ...

    Se vuoi vedere nella tabella informazioni diverse il discorso cambia. Ma se vuoi che la visualizzazione sia "mista", non puoi avere modelli diversi, le colonne devono essere le stesse, quindi o usi un nome per la colonna generico, e a seconda che sia auto o moto usi un get su un campo che l'altra tipologia non ha, o la vedo dura, ma in ogni caso potresti andare incontro a qualche forzatura ...
  • Re: Jframe jtable

    Consideravo il fatto di togliere alcune colonne per le moto, e cambiarne alcune, mentre di rimuoverne alcune per la visualizzazione mista, in modo da mostrare solo gli attributi comuni. per esempio la capacità del bagagliaio sulle moto non serve, quindi la volevo eliminare sia per le moto che nella visualizzazione mista
  • Re: Jframe jtable

    Ok ma se vuoi "rimuovere" colonne ti dovrebbe essere chiaro cosa devi nel getColumnCount (che ritornerebbe un numero diverso di colonne a seconda di qual'è il tipo di visualizzazione e quali colonne devono quindi essere mostrate), nel getColumnClass (), nel getColumnName (), nel getValueAt ().
    La cosa più difficoltosa è che se vuoi "nascondere" una colonna in mezzo, si sballano gli indici delle altre colonne, quindi getColumnClass () e getColumnName () non possono ritornare semplicemente l'elemento del vettore all'indice columnIndex che ricevono come argomento, perché in alcuni casi dovrebbero sapere che un certo indice va come dire "saltato".

    A questo punto converrebbe avere due modelli distinti per Auto e Moto (se vuoi ancora mostrare colonne diverse) e scambiare i modelli sulla tabella quando cambi visualizzazione altrimenti, se sei sicuro di voler mostrare auto e moto assieme, a questo punto puoi mostrare tutte le colonne nella tabella, e se l'informazione non è disponibile/sensata per un certo tipo di veicolo puoi lasciare la cella corrispondente vuota, o sbarrata con "/" o simili.

    KuroKami69 ha scritto:


    Automobili automobile = (Automobili) automobili.get(rowIndex);
    io qua creo l'oggetto automobile, di tipo automobili, gli faccio un casting (mi pare si chiami così) e gli dico di prendere il metodo che decido poi nello switch sotto
    giusto?
    No, qui tu non stai creando alcun oggetto, stai solo prendendo l'elemento dalla lista, e fai un cast solo per "vedere" l'oggetto come Automobile, se la lista è parametrizzata in modo più generico (con Veicolo ad esempio).

    Quello che ti conviene fare se visualizzi tutto assieme è:

    - Prendi dalla lista l'oggetto di tipo Veicolo, senza cast.
    - Se l'indice della colonna si riferisce a una colonna "comune" tra i veicoli, non fai alcun cast e restituisci il metodo definito in Veicolo.
    - Se l'indice della colonna si riferisce a una colonna che deve essere riempita solo nel caso di un tipo di veicolo, controlli che veicolo hai in mano (con instanceof), fai un cast, e prendi il metodo opportuno che è definito solo nella specifica sottoclasse.

    A tal proposito sarebbe conveniente avere le colonne comuni fino a un certo punto della tabella, poi quelle per solo auto, poi quelle per solo moto (o viceversa) per facilitare di molto l'uso degli indici.
  • Re: Jframe jtable

    Onestamente, a me sembra ancora tutto molto nebuloso, non riesco a capire, per quanto mi sforzi, l'uso pratico di quello che mi stai dicendo te. potresti per cortesia farmi un esempio di codice?
  • Re: Jframe jtable

    KuroKami69 ha scritto:


    Onestamente, a me sembra ancora tutto molto nebuloso
    Perché stai facendo molta confusione, senza avere basi solide e (forse) stai mettendo troppa "carne al fuoco".

    Parti da un po' prima: vuoi visualizzare nella stessa tabella delle auto E/O moto (quindi i 3 casi: solo auto, solo moto, auto+moto), giusto?
    Bene, allora la prima cosa da pensare è quali sono le differenze sulle colonne della tabella tra i 3 casi. Ci saranno sempre le stesse colonne per tutti i 3 casi? Oppure se solo auto ci saranno N colonne, se solo moto ci saranno M colonne e se auto+moto ci saranno Z colonne?
    Devi avere ben chiaro cosa è comune tra i due tipi (e questo lo sai/vedi bene se c'è una super-classe con proprietà comuni) e cosa invece è specifico.

    Poi in base a tutto questo si valuta l'approccio tecnico, che può anche essere fatto in diversi modi.
  • Re: Jframe jtable

    Quello che hai scritto andbin, già lo ho valutato. il mio unico problema appunto è che non riesco a visualizzare il codice... il libro mi arriva la settimana prossima (l'ho preso su internet).
    cioè io avrei modificato il mio metodo changerownumber che ho postato prima mettendoci degli if che controllano la variabile visualizza, che viene modificata ogni volta che si cambia radiobutton.
    avrei fatto una lista di veicoli e ci avrei aggiunto auto in un caso, moto in un altro e entrambi nell'ultimo. e di per se a me sembra una buona idea onestamente. però poi non so come gestire il getvalueat
Devi accedere o registrarti per scrivere nel forum
230 risposte