Jframe jtable

di il
230 risposte

230 Risposte - Pagina 12

  • Re: Jframe jtable

    KuroKami69 ha scritto:


    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.
    Sì, questo è corretto. Ti avevo già detto che un List<Veicolo> (Veicolo super-classe di Automobile e Moto) può contenere sia oggetti Automobile che oggetti Moto (in modo del tutto eterogeneo). Chiaramente gli oggetti li estrai e "vedi" solo come Veicolo.

    KuroKami69 ha scritto:


    però poi non so come gestire il getvalueat
    Finché tutti i dati di cui hai bisogno sono in Veicolo, non c'è alcuna questione particolare. Da un List<Veicolo> estrai un Veicolo ed usi i suoi getXXX(). Se invece i dati che ti servono sono specifici e noti solo alle sotto-classi, allora hai bisogno: a) di un check del tipo, poi b) di un cast per poter "vedere" l'oggetto secondo il tipo specifico.

    KuroKami69 ha scritto:


    il libro mi arriva la settimana prossima (l'ho preso su internet)
    Ma il libro (il De Sio Cesari?) ti spiegherà tutti i concetti/teoria/regole della programmazione Java .... NON ti parlerà di certo di JTable e table model. E su concetti/teoria/regole ne avrai per mesi di studio!
  • Re: Jframe jtable

    Il de sio cesari si, so che non mi spiega queste cose, ma era per dirvi che dopo giorni ho finalmente messo in pratica il vostro suggerimento di prendermi un libro
    purtroppo devo rivalutare sia la classe veicolo che le 2 sottoclassi auto e moto. anche se quello che ho scritto io è corretto come codice, come concetto è fondamentalmente sbagliato.
    purtroppo mi capita spesso che quando inizio a fare una cosa, non ci ragiono sufficientemente su e perdo pezzi di logica per strada
    quindi alla fine avrò la superclasse veicolo con attributi comuni a entrambi (che poi saranno gli unici che mostrerò quando farò vedere entrambi i mezzi) e le 2 sottoclassi con le loro variabili specifiche

    purtroppo io sono una zucca dura e imparo in fretta solo quando ho qualcuno che mi spiega a voce, e accompagna le spiegazioni a del codice. quindi ci metterò un bel po' ad assorbire quello che mi scrivete voi.
    cioè è più come la mia mente "archivia" le informazioni. un ricordo vocale lo rievoca molto più facilmente rispetto a un ricordo scritto. tranne se lo scritto è prodotto da me. e ovviamente leggere ad alta voce quello che scrivete non è di aiuto ahahahaha

    appena ho sistemato la classe veicolo e le sottoclassi, in serata credo, vorrei chiedere la vostra opinione sul codice che produrrò per riempire la lista. se quello è passabile allora andrò allo step successivo
  • Re: Jframe jtable

    Bene, visto che questo thread non viene usato da un po', vediamo di ridargli vita
    domandina.
    ho fatto un jcombobox con relativo listener
    
    private int s;
    
    		Integer[] pattern = new Integer[] {1, 2, 3, 5, 10, 15, 20};
    		JComboBox<Integer> pl = new JComboBox<Integer>(pattern);
    		pl.setEditable(true);
    		
    		pl.addActionListener (new ActionListener()
    		{
    			@Override
    		    public void actionPerformed(ActionEvent event)
    			{
    				JComboBox<Integer> pl = (JComboBox<Integer>) event.getSource();
    				s = (Integer) pl.getSelectedItem();
    				System.out.println(s);
    			}
    		});
    
    e poi nel mio spinner ho messo la s come incremento
    
    SpinnerModel jsm = new SpinnerNumberModel(0, 0, 1000, s);
    
    noto però che nonostante il valore di s cambi, non cambia l'aumento dello spinner. se ne può quindi dedurre che in qualche modo devo dirgli "hey guarda che il valore di s è cambiato, devi adattarti!"
    quindi, ecco la domanda.
    il cambiamento dove glielo devo comunicare? uhm
  • Re: Jframe jtable

    KuroKami69 ha scritto:


    Bene, visto che questo thread non viene usato da un po', vediamo di ridargli vita
    Beh ok .. tanto tra un po' questo diventa il highest hot topic of the year del forum

    KuroKami69 ha scritto:


    noto però che nonostante il valore di s cambi, non cambia l'aumento dello spinner. se ne può quindi dedurre che in qualche modo devo dirgli "hey guarda che il valore di s è cambiato, devi adattarti!"
    Certo. Ma quando ci sono cose del genere, cerca anche di "ragionare".

    Nel momento in cui viene eseguito

    new SpinnerNumberModel(0, 0, 1000, s);

    tu stai creando un nuovo oggetto SpinnerNumberModel e gli stai passando il valore che s ha in QUEL MOMENTO. SpinnerNumberModel si terrà una copia di questo valore da qualche parte al suo interno (in una sua variabile di istanza, chiaramente).

    Se successivamente tu cambi SOLO il valore della tua variabile s, questo NON si riflette su altro!! SpinnerNumberModel non ne può "sapere" nulla di questa tua modifica.

    Semplicemente DEVI usare il setStepSize(Number stepSize) di SpinnerNumberModel. Nota che l'argomento è Number, perché SpinnerNumberModel tratta stepSize e value genericamente come Number. Ma non è un problema per te: int lo puoi automaticamente boxare a Integer e Integer è-un Number.


    P.S. piccola nota:

    JComboBox<Integer> pl = (JComboBox<Integer>) event.getSource();

    non è sbagliato. Ma è "brutto". Perché quando ci sono di mezzo i generics, un cast "parametrizzato" di quel tipo è sempre unchecked ed hai un warning emesso dal compilatore e che puoi solo sopprimere.
    Dato che la implementazione del ActionListener è specifica solo per quel tuo JComboBox, allora NON hai da usare il "source" né devi distinguere tra più source.
    Ti basta fare riferimento a quel pl che hai definito prima. Se sei almeno con Java 8 è a posto così. Se < Java 8 devi mettere quella variabile come final.
  • Re: Jframe jtable

    andbin ha scritto:


    KuroKami69 ha scritto:


    Bene, visto che questo thread non viene usato da un po', vediamo di ridargli vita
    Beh ok .. tanto tra un po' questo diventa il highest hot topic of the year del forum

    andbin ha scritto:


    KuroKami69 ha scritto:


    noto però che nonostante il valore di s cambi, non cambia l'aumento dello spinner. se ne può quindi dedurre che in qualche modo devo dirgli "hey guarda che il valore di s è cambiato, devi adattarti!"
    Certo. Ma quando ci sono cose del genere, cerca anche di "ragionare".

    Nel momento in cui viene eseguito

    new SpinnerNumberModel(0, 0, 1000, s);

    tu stai creando un nuovo oggetto SpinnerNumberModel e gli stai passando il valore che s ha in QUEL MOMENTO. SpinnerNumberModel si terrà una copia di questo valore da qualche parte al suo interno (in una sua variabile di istanza, chiaramente).

    Se successivamente tu cambi SOLO il valore della tua variabile s, questo NON si riflette su altro!! SpinnerNumberModel non ne può "sapere" nulla di questa tua modifica.

    Semplicemente DEVI usare il setStepSize(Number stepSize) di SpinnerNumberModel. Nota che l'argomento è Number, perché SpinnerNumberModel tratta stepSize e value genericamente come Number. Ma non è un problema per te: int lo puoi automaticamente boxare a Integer e Integer è-un Number.
    questo setstepsize lo devo richiamare fuori giusto? oppure al posto di s gli metto setStepSize(s)?

    andbin ha scritto:


    P.S. piccola nota:

    JComboBox<Integer> pl = (JComboBox<Integer>) event.getSource();

    non è sbagliato. Ma è "brutto". Perché quando ci sono di mezzo i generics, un cast "parametrizzato" di quel tipo è sempre unchecked ed hai un warning emesso dal compilatore e che puoi solo sopprimere.
    Dato che la implementazione del ActionListener è specifica solo per quel tuo JComboBox, allora NON hai da usare il "source" né devi distinguere tra più source.
    Ti basta fare riferimento a quel pl che hai definito prima. Se sei almeno con Java 8 è a posto così. Se < Java 8 devi mettere quella variabile come final.
    quindi sarà tipo s = pl?
  • Re: Jframe jtable

    KuroKami69 ha scritto:


    questo setstepsize lo devo richiamare fuori giusto? oppure al posto di s gli metto setStepSize(s)?

    quindi sarà tipo s = pl?
    No, questo assegnamento non ha senso. pl è un JComboBox<Integer> mentre s è un int. Ragiona anche sui tipi! Stai assegnando una anguria dentro un contenitore che tiene una patata.

    Nota che una variabile int s di per sé non ti servirebbe nemmeno. Cioè se ti serve per ALTRI motivi, ok. Ma altrimenti puoi fare.
    public void actionPerformed(ActionEvent event) {
        jsm.setStepSize((Integer) pl.getSelectedItem());
    }
    Sì ... tutto qui (chiaramente jsm e pl devono essere "accessibili" da lì dentro).
  • Re: Jframe jtable

    Ma quando chiamo setStepSize mi dice symbol not found mmh
  • Re: Jframe jtable

    Ok funziona. non ho ben capito perché quando ho fatto copia e insomma del tuo setStepSize non mi ha dato errore, mentre quando l'ho scritto io, e poi copiato e incollato dalla documentazione oracle, mi diceva cannot find symbol, ma ok. misteri. se non cancello i file .class, quando compilo dopo alcune modifiche succede che non compila... non capirò mai ste cose
  • Re: Jframe jtable

    Senti, posso chiederti, già che ci sono, come posso fare in modo che il panel "header" non si ridimensioni in altezza quando ingrandisco il frame per favore? ho provato un po' di cose ma non mi è uscito, forse un semplice header.setSize() basta?
    però a me serve che la lunghezza si adatti e che l'altezza rimanga fissa mmh

    p.s.

    andbin ha scritto:


    Certo. Ma quando ci sono cose del genere, cerca anche di "ragionare".
    dopo che avevo scritto il messaggio, avevo cambiato un paio di cose e avevo messo il box
  • Re: Jframe jtable

    KuroKami69 ha scritto:


    Come posso fare in modo che il panel "header" non si ridimensioni in altezza quando ingrandisco il frame per favore? ho provato un po' di cose ma non mi è uscito, forse un semplice header.setSize() basta?
    però a me serve che la lunghezza si adatti e che l'altezza rimanga fissa mmh
    No, evita il più possibile il setSize, non è quasi mai la soluzione. Devi usare il giusto layout manager, e lasciare che svolga lui tutto il lavoro.
    Nel tuo caso setta al tuo pannello "FrameTabella" un BorderLayout, aggiungi il pannello "Header" in BorderLayout.NORTH e lo scrollpane in BorderLayout.CENTER.
    Questo farà sì che l'header occupi tutta la lunghezza del frame e solo l'altezza "necessaria", mentre tutto il resto dello spazio sarà usato dallo scrollpane.
  • Re: Jframe jtable

    Ho capito cosa dovrei fare, ma non ho capito in che modo ahahaha
    quelle cose le devo aggiungere nel frame e non nel pane della tabella o dell'header giusto?
  • Re: Jframe jtable

    Fondamentalmente, basandomi sull'ultima versione che ho della tua classe FrameTabella:

    - Sostituisci setLayout (new BoxLayout (...)) con setLayout (new BorderLayout (0, 10)) (dove 10 è il gap che vuoi tra l'header e lo scrollpane, solo per farti un esempio), o meglio non usi setLayout ma passi il BorderLayout all'invocazione del costruttore di JPanel (super (new BorderLayout (...))).
    - Usi il metodo add(Component comp, Object constraints) che JPanel eredita da Container, al posto del semplice add con il componente. Quel constraints sarà usato dal layout per determinare la posizione in cui viene aggiunto il componente, ed è definito come Object perché in base al Layout potrebbe cambiare il tipo di oggetto (ad esempio GridBagLayout accetta solo un oggetto di tipo GridBagConstraints, altrimenti lancia un'eccezione a runtime). Quindi, alla fine della classe:
    
    add(header, BorderLayout.NORTH);
    add(p, BorderLayout.CENTER);
    
    Se vai avanti con le interfacce grafiche devi almeno leggerti questo: A Visual Guide to Layout Managers, ti servono le basi quantomeno, per layout come il GridBagLayout puoi aspettare, anche se una volta capito ti permette con poche righe di fare cose che altrimenti devi fare innestando pannelli uno dentro all'altro (e a volte non basta).
  • Re: Jframe jtable

    Ok ci ero arrivato per tentativi. ho notato che lasciando il boxlayout, non mi ridimensionava la tabella però se restringevo la finestra allora me lo incollava in alto e la tabella subito sotto. quindi ci ho riflettuto un attimo e ho fatto quello che hai scritto te
    è una piccola soddisfazione essere arrivati da soli, o quasi, alla soluzione, dopo averci pensato su
  • Re: Jframe jtable

    Domandina.
    allora ora sto finalmente cercando di far visualizzare auto, moto o entrambi.
    questa parte qua
    
    Automobile automobile = (Automobile)veicoli.get(rowIndex);
    		
    			switch(columnIndex)
    			{
    				case 0: return automobile.getMarca();
    				case 1: return automobile.getModello();
    				case 2: return automobile.getStato();
    				case 3: return automobile.getPrezzo();
    				case 4: return automobile.getTipo();
    				case 5: return automobile.getColore();
    				case 6: return automobile.getKm();
    				case 7: return automobile.getAnnoImmatricolazione();
    				case 8: return automobile.getScadenzaBollo();
    				case 9: return automobile.getTarga();
    				case 10: return automobile.getPosti();
    				case 11: return automobile.getPortiere();
    				case 12: return automobile.getBagagliaio();
    				case 13: return automobile.getCilindrata();
    				case 14: return automobile.getCilindri();
    							
    				case 15: if (c == false) return automobile.getCavalli();
    						else return automobile.conversioneCK(automobile.getCavalli());
    					
    				case 16: return automobile.getRapportoPP();
    				case 17: return automobile.getMotore();
    				case 18: return automobile.getConsumo();
    				case 19: return automobile.getTrazione();
    				case 20: return automobile.getCambio();
    				case 21: return automobile.getMarce();
    				case 22: return automobile.getLunghezza();
    				case 23: return automobile.getMassaVuoto();
    				case 24: return automobile.getAltezzaTerra();
    				case 25: return automobile.getTettuccio();
    				default: return null;
    
    visto che quasi tutti i miei get sono sulla superclasse veicolo, non posso semplicemente cambiare automobile in veicolo, per gli attributi comuni, e poi metterci un if sugli attributi specifici? per esempio, se invece di essere selezionato auto, c'è moto, nPosti mi diventa parabrezza, e sarà un moto.getParabrezza()
    e tutti gli attributi non usati spariscono
    EDIT: che sostanzialmente è quello che ha scritto @andbin all'inizio di questa pagina mmh
  • Re: Jframe jtable

    Bene, avevo pensato di editare in questo modo il changeRowNumber, ma sto avendo difficoltà, quindi immagino che dovrò passare a un'altra soluzione
    
    ublic void changeRowNumber(int rowIndex)
    	{
    		int size = veicoli.size();
    		if (!(veicoli.size() == rowIndex))
    		{
    			if (veicoli.size() > rowIndex)
    			{
    				while(veicoli.size() > rowIndex)
    				veicoli.remove(rowIndex);
    				fireTableRowsDeleted(veicoli.size()-1, size-1);
    			}
    			else
    			{
    				while(veicoli.size() < rowIndex)
    				{
    					int n = d.inx();
    					int a = d.rnd(80);
    					int m = d.rnd(53);
    					if(visualizza.equals("auto"))
    					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(visualizza.equals("moto"))
    					veicoli.add(new Moto(d.setMarcaAuto(m), d.setModelloAuto(m), d.setTipoAuto(n), d.setPrezzoAuto(n), d.setCavalliAuto(n), d.setMassaAuto(n), d.setCilindrataAuto(n),					 						d.setConsumoAuto(n)));
    					else
    					{
    						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)));
    						veicoli.add(new Automobile(d.setMarcaAuto(m), d.setModelloAuto(m), d.setTipoAuto(n), d.setPrezzoAuto(n), d.setCavalliAuto(n), d.setMassaAuto(n), d.setCilindrataAuto(n),					 						d.setConsumoAuto(n)));
    					}
    				}
    				fireTableRowsInserted(size, rowIndex-1);
    			}
    		}
    	}
    
    non riesco a inserire un removeAll() efficace. se lo metto nel while(veicoli.size() < rowIndex), ogni volta che aggiungo elementi a quelli attualmente visualizzati, mi ricrea da 0 la lista... il che andrebbe anche bene se lavorassi con 2 liste, come si diceva qualche messaggio fa mmh
Devi accedere o registrarti per scrivere nel forum
230 risposte