Jframe jtable

di il
230 risposte

230 Risposte - Pagina 7

  • Re: Jframe jtable

    OMMIODDIO FUNZIONA <3
    OMG
    OSSI DANNAZIONE FUNZIONA MA VIENI
    sempre detto io che la calma e la riflessione risolvono ogni problema
    il problema è che nel frame c'è solo la tabella, senza bottoni ahahaha uhmm
    domanda anzitutto: c'è un modo per avere lo scroll orizzontale?
  • Re: Jframe jtable

    KuroKami69 ha scritto:


    domanda anzitutto: c'è un modo per avere lo scroll orizzontale?
    Tu avevi fatto:

    private JScrollPane p = new JScrollPane();

    ma poi

    p.add(moto); p.add(both);

    che sono sbagliati. Non è così che si usa JScrollPane. Vedi il mio esempio.
  • Re: Jframe jtable

    Si, avevo fatto un copia e incolla del frame creato nel main e mi ero scordato di togliere quei 2 elementi p.
    quando creavo solo il frame, senza tabella, aggiungevo tutti gli elementi al pane e poi lo aggiungevo al frame.
    qua però io non ho un frame mmh mi sto confondendo di nuovo
  • Re: Jframe jtable

    No, non capisco davvero
    se prima tutti gli elementi li caricavo nel pane, ora la tabella mi porta via tutto
    quindi io dovrei caricare la tabella su un frame dove prima carico tutto il resto?
  • Re: Jframe jtable

    Devo usare un container, un layout manager giusto?
  • Re: Jframe jtable

    KuroKami69 ha scritto:


    Devo usare un container, un layout manager giusto?
    Sì ma devi comprenderli .... e si tratta di studiare. Ma prima di arrivare ai layout manager ce ne sarebbero 1000 di cose da sapere prima ....

    Consiglio, ma davvero: prendi un bel libro su Java e inizia a leggere. Se avrai qualunque dubbio, chiedi pure e io sono uno dei primi che possono rispondere su tutto il linguaggio.
  • Re: Jframe jtable

    Lo farò tranquillo, finisco questo esercizio qua e dopo prendo il libro e studio. Davvero. Però, cerca di capire un attimo il mio punto di vista. Per me è più facile studiare se poi ho giá visto qualcosa, perchè le cose hanno più senso, hanno un'applicazione pratica, non so se mi spiego.. esempio banale, metti che ho appena iniziato e voglia stampare 10 numeri e provo il ciclo for, poi quando lo vado a studiare, allora ho un riferimento, del tipo "aaash si mi ricordo, l'ho usato per fare questo, quindi è così che fubziona dietro le quinte" non so se mi spiego...
  • Re: Jframe jtable

    Bene ho risolto anche il problema grafico. posso quindi chiederti di spiegarmi perché succedono queste 2 cose?
    1)
    
    import javax.swing.*;
    import javax.swing.event.*;
    import javax.swing.table.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.util.ArrayList;
    import java.util.List;
    
    public class FrameTabella extends JPanel 
    {
    	private AutomobileTableModel atb;
    	private JTable tb;
    	private JScrollPane p;
    	
    		
    	ArrayList<Automobili> automobile = new ArrayList<Automobili>();
    	
    	private void genTable(int n) 
    	{
    		for (int i = 0; i < n; i++)
    		{
    			automobile.add(new Automobili());
    		}
    	}
    	
    	public FrameTabella()
    	{
    		super();
    		
    		JPanel header = new JPanel();
    
    		setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
    		
    		JLabel jl = new JLabel("Inserisci il numero di veicoli da visualizzare");
    		
    		JLabel jl1 = new JLabel("Scegli cosa visualizzare");
    		
    	
    		JRadioButton auto = new JRadioButton("Auto");
    		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();
    				if (button == auto) JOptionPane.showMessageDialog(null, "auto");
    				else if (button == moto) JOptionPane.showMessageDialog(null, "moto");
    				else if (button == both) JOptionPane.showMessageDialog(null, "entrambi");
    			}
    		}
    	
    		RadioButtonActionListener al = new RadioButtonActionListener();
    		auto.addActionListener(al);
    		moto.addActionListener(al);
    		both.addActionListener(al);
    	
    		ButtonGroup group = new ButtonGroup();
    		group.add(auto);
    		group.add(moto);
    		group.add(both);
    			
    		JCheckBox cb = new JCheckBox("Mostra in kw");
    		cb.addActionListener(new ActionListener()
        	{
    			@Override
    			public void actionPerformed(ActionEvent e)
    			{
    				JCheckBox c = (JCheckBox)e.getSource();
    				if(c.isSelected())
    				JOptionPane.showMessageDialog(null, "selezionato");
    				else
    				JOptionPane.showMessageDialog(null, "deselezionato");
    			}
    		});	
    	
    		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();
    				genTable(i);
    			}
    		});
    
    		//setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
    
    		header.add(jl);
    		header.add(js);
    		header.add(b);
    		header.add(jl1);
    		header.add(auto);
    		header.add(moto);
    		header.add(both);
    		header.add(cb);
    		
    		//genTable(10);
    		atb = new AutomobileTableModel(automobile);
    		tb = new JTable(atb);
    		p = new JScrollPane(tb);
    		
    		add(header);
    		add(p);
    		setVisible(true);
    	}
    }
    
    se il genTable alla fine, quello a commento, lo lascio a commento, la mia tabella è vuota.
    il che dovrebbe essere normale visto che prende il valore dello spinner. fin qua credo di essere abbastanza nel giusto.
    se però premo il bottone "Visualizza", non accade assolutamente nulla.
    mi viene quindi il dubbio
    devo implementare, nel tablemodel (quello praticamente identico al tuo) un metodo per aggiungere e rimuovere righe giusto?
  • Re: Jframe jtable

    KuroKami69 ha scritto:


    devo implementare, nel tablemodel (quello praticamente identico al tuo) un metodo per aggiungere e rimuovere righe giusto?
    Sì l'ho già detto più volte. Solo aggiornare una struttura dati e basta, di per sé non fa cambiare nulla visivamente nella tabella. Rivedi quanto dicevo in precedenza.
  • Re: Jframe jtable

    Alle 4 di notte, dopo aver passato 3h a sistemare il frame in modo da visualizzarla correttamente, non eronesattamente in grado di pensare ahahhahaba
    Ma quindi, devo rimuovere elementi dalla lista anche, oltre che le righe, quando io decremento il numero di elementi da visualizzare giusto (mi sono appena svegliato quindi sto ancora mettendo in moto il cervello)
  • Re: Jframe jtable

    KuroKami69 ha scritto:


    Ma quindi, devo rimuovere elementi dalla lista anche, oltre che le righe, quando io decremento il numero di elementi da visualizzare giusto
    Devi stabilire tu quali metodi definire nel table model per modificare la tabella.
    Vuoi aggiungere 1 oggetto per volta?
    Vuoi reimpostare l'intera lista di oggetti?
    Vuoi rimuovere 1 oggetto per volta?
    ecc...
  • Re: Jframe jtable

    KuroKami69 ha scritto:


    Ma quindi, devo rimuovere elementi dalla lista anche, oltre che le righe, quando io decremento il numero di elementi da visualizzare giusto (mi sono appena svegliato quindi sto ancora mettendo in moto il cervello)
    Se ho capito bene quello che vuoi fare tu non è togliere/rimuovere le automobili dalla tabella, quindi rimuovere gli elementi dalla lista non ha molto senso, perché se poi aumenti il numero di righe da visualizzare non verranno più mostrate, a meno che tu non ti memorizzi gli oggetti che togli per poi rimetterli in seguito, cosa abbastanza insensata.

    Tu vuoi invece che il modello sottostante rimanga immutato, ma che siano filtrate in tempo reale le righe da mostrare all'utente.
    Il problema è che il concetto di filtro per come è stato implementato in modo "standard", ovvero con l'uso di un RowFilter, non prevede di considerare l'indice della riga. Guarda questo esempio qui (riporto solo il codice che ci riguarda):
    
    RowFilter<Object, Object> filter = new RowFilter<Object, Object>() {
          public boolean include(Entry entry) {
            Integer population = (Integer) entry.getValue(1);
            return population.intValue() > 3;
          }
        };
        TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model);
        sorter.setRowFilter(filter);
        table.setRowSorter(sorter);
    
    Quell'Entry sarebbe fondamentalmente un oggetto che contiene i dati visualizzati nella riga, campo per campo, come vedi nell'esempio si prende l'indice 1, che nella colonna corrisponde al valore dell'item, che se minore o uguale di 3 causerà il fatto che la riga venga nascosta, ma non cancellata dalla tabella.

    RowFilter fornisce poi più metodi statici, tra cui il più utile è forse regexFilter (String regex, int... indices), che crea un filtro predefinito che filtra le righe in base al testo (usando un espressione regolare) contenuto nelle celle. Ma ancora una volta questo non ti aiuta a nascondere le righe con un "indice" superiore al numero di righe da mostrare.

    Una soluzione (bruttina) con il RowFilter sarebbe di aggiungere alla tabella una colonna (che verrà poi nascosta dal TableColumnModel) che abbia un indice progressivo che serve solo come "id" della riga, quindi verrà introdotto nell'Entry passata al RowFiter (non ti occupi tu di richiamare il metodo o costruire l'Entry, è automatico) e potrai usarlo per dire: "se l'indice della riga è maggiore di n include ritorna false".

    Ma questo andrebbe un po' a rompere il TableModel customizzato che stai utilizzando, dovresti aggiungere una colonna, cambiare il getValueAt (), e dovresti "sperare" che questa colonna sia nascosta da un'altra parte, perché non è il AutomobileTableModel che può decidere quali colonne vengono mostrate e quali no.

    Se usi un tuo modello personalizzato puoi mantenere uno stato (con delle variabili) che memorizzi:

    - Quante righe vuoi mostrare
    - Quali tipi di veicoli vuoi visualizzare

    Poi puoi costruire dei metodi per il tuo modello, es. setLimiteRighe (int row), setMostraAutomobili (boolean value), setMostraMoto (boolean value) etc., che vadano a modificare questi valori.

    Poi però tutto il resto deve essere coerente con questa struttura! Come avevamo detto in precedenza, JTable non è un componente "facile" da utilizzare, e filtrare/ordinare le righe è una delle parti più difficili (almeno a mio parere) se non utilizzi i metodi già implementati.
  • Re: Jframe jtable

    Ringrazio entrambi per la risposta, e rispondo ad @Ansharja
    se nello spinner decido di visualizzare di default 10 auto, e poi voglio mostrarne 20, premendo il bottone visualizza, allora mi andrà a creare altri 10 oggetti da aggiungere alla lista.
    certo se dopo volessi farne vedere solo 5, allora la soluzione migliore, per non perdere l'integrità dei dati della tabella, dovrei solo nascondere le righe in più, perché se rimuovessi ogni volta elementi dalla lista, mi andrebbe a creare sempre cose diverse, mentre come hai suggerito te, le 15 righe che nascondo non perderanno il loro valore, e sarebbe anche più corretto.
    ma dato che è troppo macchinosa e non ho la minima voglia di far volare più santi di quelli che sicuramente voleranno da qua a breve, mi limiterò a rimuovere elementi sia dalla lista sia dalla tabella, e alla necessità li riaggiungo.
    il metodo che creo nella tablemodel (@andbin non sclerarmi dietro per favore, lo chiedo giusto per sicurezza) di rimozione e aggiunta righe, lo posso chiamare nel listener giusto?
  • Re: Jframe jtable

    Se ti basta questo, allora ok, non pensavo volessi modificare la tabella.

    In realtà non volevo scoraggiarti a lasciar perdere il fatto di filtrare le righe, anche perché per auto e moto comunque dovresti fare quello, sarebbe bruttino togliere dalla lista tutte le automobili o moto ogni volta, o quantomeno se prevedi questa funzionalità poi dovresti realizzarla in modo abbastanza coerente, altrimenti io userei dei pulsanti chiamati ad esempio "Rimuovi auto", "Rimuovi moto" e non dei componenti per la selezione degli oggetti da mostrare.

    Se invece vuoi provare a filtrare, devi pensare molto bene a come realizzare la cosa, quindi non partire subito in quarta a scrivere codice se prima non ti è chiaro cosa dovresti fare, piuttosto prova a buttare giù delle idee su come imposteresti il tutto.
    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?

    Una volta che avrai implementato i metodi per la rimozione/aggiunta di veicoli suggeriti da @andbin, li potrai sicuramente richiamare all'interno dei listener dei componenti, che devono quindi avere accesso al tuo table model (quindi non dovresti scriverli in un'altra classe per dirne una). Ricordati come ha detto lui di mandare la notifica di una modifica effettuata, guardati la documentazione per fare questo.
  • Re: Jframe jtable

    Ma in effetti io pensavo che se si selezionava auto, allora veniva caricata la lista auto, se si selezionava moto allora veniva caricata la lista moto e se si selezionava entrambi veniva caricata una lista con entrambi i veicoli (avere 3 liste non ha senso credo)
    cioè lo so, guardando questo piccolo programma come se fosse un sito, è coerente dire "ti carico tutti i veicoli che ho nel database e te ne mostro 20 per pagina, poi se vuoi ti fornisco dei filtri per scegliere cosa visualizzare" senza rifare il database ogni volta.
    qua onestamente non ci ho nemmeno pensato a quello che dici te
    dovrei mantenere i veicoli in eccesso (se prima ne volevo vedere 15 e ora 5, ne ho 10 di eccesso) e nasconderli, e aggiungerne tot qualora si volesse visualizzare un numero di elementi inferiore comunque a quello selezionato prima (se ora ne voglio vedere solo 8 sui 15 creati prima devo aggiungerne 3)
    mi sembra abbastanza complicato onestamente
    cioè non riesco nemmeno ad immaginare come fare
    comunque può essere una soluzione che implemento eh, ma magari non ora.
    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);
    	}
    
    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);
    			}
    		});
    
    EDIT:
    quintali di errori ahahaha ottimo devo dire
Devi accedere o registrarti per scrivere nel forum
230 risposte