Jframe jtable

di il
230 risposte

230 Risposte - Pagina 15

  • Re: Jframe jtable

    Ok niente ho risolto semplicemente gli passavo un parametro non compatibile con il tipo di colonna
    @EDIT:
    @andbin, ci ero arrivato anche ragionando, mi è vneuto il pallino solo 2 minuti fa che gli stavo passando dei parametri non corretti.
    ma ora viene la parte migliore! cercare di implementare il map per nascondere le colonne!
  • Re: Jframe jtable

    Premettendo che
    
    public enum DisplayMode
    	{
       		AUTO_E_MOTO,
       		AUTO_ONLY,
       		MOTO_ONLY
    	}
    
    il metodo che ha fatto @Ansharja
    
    	public DisplayMode setDisplayMode(DisplayMode mode)
    	{
    		return currentDisplayMode;
    	}
    
    prende in ingresso un enum giusto? se è così, perché quando ho provato a passargli tipo DisplayMode.AUTO_ONLY, o anche solo AUTO_ONLY, mi ha dato errore, incompatyble type, o una roba simile?
    (anche se dopo lo avevo cambiato, e riprovato gli stessi abbinamenti in ingresso, in questo modo)
    
    private DisplayMode currentDisplayMode;
    
    	public void setDisplayMode(DisplayMode mode)
    	{
    		this.currentDisplayMode = mode;
    	}
    
    e non funzionava uguale
  • Re: Jframe jtable

    KuroKami69 ha scritto:


    @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;
          }
       }
    Questo codice ti funziona? Ne dubito, almeno che tu non stia già filtrando le righe e rimuovendo i tipi non corrispondenti.
    Altrimenti, se mode è uguale ad "auto", nessuno ti assicura che l'oggetto all'indice rowIndex della lista veicoli sia un automobile (e viceversa), devi fare il controllo con instanceof, altrimenti il cast ti fallisce alla prima occasione in cui trovi un oggetto di tipo Moto ...

    E comunque io ti consiglierei di fare il cast una singola volta, una volta che sai di non dover ritornare una "colonna comune": prima controlli che tipo di veicolo hai (instanceof), poi fai il cast, e poi controlli l'indice di colonna per ritornare il risultato del metodo corretto (in pratica gli switch vanno a un certo punto inseriti dentro a degli if). Non è obbligatorio ma sicuramente più veloce, e ti consente di usare l'instanceof solo due volte.

    KuroKami69 ha scritto:


    Premettendo che
    
    public enum DisplayMode
    	{
       		AUTO_E_MOTO,
       		AUTO_ONLY,
       		MOTO_ONLY
    	}
    
    il metodo che ha fatto @Ansharja
    
    	public DisplayMode setDisplayMode(DisplayMode mode)
    	{
    		return currentDisplayMode;
    	}
    
    prende in ingresso un enum giusto? se è così, perché quando ho provato a passargli tipo DisplayMode.AUTO_ONLY, o anche solo AUTO_ONLY, mi ha dato errore, incompatyble type, o una roba simile?
    (anche se dopo lo avevo cambiato, e riprovato gli stessi abbinamenti in ingresso, in questo modo)
    
    private DisplayMode currentDisplayMode;
    
    	public void setDisplayMode(DisplayMode mode)
    	{
    		this.currentDisplayMode = mode;
    	}
    
    e non funzionava uguale
    Però il primo set che hai scritto ormai dovresti avere capito che non ha alcun senso! Cioè tu passi un parametro al metodo set, non lo utilizzi all'interno per settare la variabile, e poi ritorni il valore della variabile a cui dovevi settarlo? Praticamente è un get scritto male ...

    Il secondo set che hai scritto, che ritorna void e fa l'assegnazione all'interno è corretto. Prende in ingresso un elemento della enum quindi, se l'enum l'hai definita come sopra, è corretto passare al metodo DisplayMode.AUTO_ONLY, non puoi omettere il nome della enum, AUTO_ONLY da solo non puoi usarlo (puoi farlo ad esempio all'interno dei vari case di uno switch).

    Se non posti l'errore con la riga coinvolta è un po' difficile capire quale sia la causa, ma penso sia probabile che tu stavi provando ad assegnare il risultato del primo metodo che hai scritto (che come detto NON deve avere un tipo di ritorno) a una variabile di un tipo diverso.
    Quindi una volta corretta la definizione del set, quando lo richiami senza assegnare a nulla il risultato (è VOID!) non dovresti avere un errore.

    Se così non è posta il messaggio, altrimenti si capisce poco ...
  • Re: Jframe jtable

    KuroKami69 ha scritto:


    
    private DisplayMode currentDisplayMode;
    
    	public void setDisplayMode(DisplayMode mode)
    	{
    		this.currentDisplayMode = mode;
    	}
    
    e non funzionava uguale
    Questo tecnicamente è CORRETTO. E' un "setter" appropriato. Ma l'unica cosa che fa è cambiare il valore di una variabile di istanza di quell'oggetto. Di per sé non influisce "attivamente" su nient'altro!! Se tu vuoi che invocando setDisplayMode faccia cambiare veramente qualcosa visivamente, allora devi fare ALTRO nel setDisplayMode. E cosa fare DIPENDE da dove è questo setDisplayMode. E' nel table model? Se sì, allora puoi notificare che la struttura della tabella è cambiata.
  • Re: Jframe jtable

    L'idea era di usarlo con i radio button per notificare il cambiamento di stato, sia alla tabella sia al tablemodel, senza far ricorso a una stringa, cioè fare in modo che dentro al case che ho postato pochi messaggi fa, invece che esserci if(mode.equals("auto"), ci sia if(currentDisplayMode == AUTO_ONLY), mi pareva fosse questo il suggerimento di @Ansharja, ma forse non ho capito bene io. una domanda. ho ipotizzato che usando l'hider di stack overflow, postato da @Ansharja nel primo messaggio della pagina precedente, la struttura della tabella cambia, devo quindi usare un fire?
  • Re: Jframe jtable

    KuroKami69 ha scritto:


    L'idea era di usarlo con i radio button per notificare il cambiamento di stato
    Cosa usi graficamente per una scelta di questo tipo è indifferente. Potrebbero esserci 3 radio button, 3 pulsanti, 3 voci in un combobox, 3 voci di menù ecc... Non ha granché importanza per ciò che deve stare "sotto" a livello logico.

    KuroKami69 ha scritto:


    senza far ricorso a una stringa, cioè fare in modo che dentro al case che ho postato pochi messaggi fa, invece che esserci if(mode.equals("auto"), ci sia if(currentDisplayMode == AUTO_ONLY), mi pareva fosse questo il suggerimento di @Ansharja
    Sì, esatto! Ma l'uso di una enum è solo una soluzione un po' più "pulita" ed elegante rispetto alle stringhe. Quindi la questione NON è stringhe vs enum !!

    KuroKami69 ha scritto:


    ho ipotizzato che usando l'hider di stack overflow, postato da @Ansharja nel primo messaggio della pagina precedente, la struttura della tabella cambia, devo quindi usare un fire?
    Se invocando il setDisplayMode vuoi che la struttura venga cambiata già a livello di TABLE MODEL, allora sì setDisplayMode deve essere nel table model e dovrai chiamare il fireTableStructureChanged() ereditato da AbstractTableModel. fireTableStructureChanged() è la notifica più "radicale" perché dice alla tabella che: i nomi e/o i tipi e/o il numero di colonne POSSONO essere cambiate. Quindi la tabella chiamerà sicuramente di nuovo il getColumnCount() e tu con la informazione memorizzata nel campo currentDisplayMode potrai dire: ora c'è un altro numero X di colonne

    Ripeto: questo è a livello di table model. Se invece vuoi "giocare" in modo più furbo magari a livello del TableColumnModel (che è un'altra cosa, mi pare fosse questo che diceva quella discussione su stack overflow), allora è un ALTRO conto.
  • Re: Jframe jtable

    Io ho ripreso lo script su stack overflow, e ci sto giocando un pochino su. questo
    
    import java.awt.*;
    import java.awt.event.*;
    import java.util.*;
    import javax.swing.*;
    import javax.swing.table.*;
    
    /** @see https://stackoverflow.com/questions/6796673 */
    public class TableColumnHider
    {
        private JTable table;
        private TableColumnModel tcm;
        private Map<String, IndexedColumn> hidden = new HashMap<String, IndexedColumn>();
    
        public TableColumnHider(JTable table)
    	{
            this.table = table;
            this.tcm = table.getColumnModel();
        }
    
        public void hide(String columnName) 
    	{
            int index = tcm.getColumnIndex(columnName);
            TableColumn column = tcm.getColumn(index);
            IndexedColumn ic = new IndexedColumn(index, column);
            if (hidden.put(columnName, ic) != null)
    		{
                throw new IllegalArgumentException("Duplicate column name.");
            }
            tcm.removeColumn(column);
        }
    
        public void show(String columnName)
    	{
            IndexedColumn ic = hidden.remove(columnName);
            if (ic != null)
    		{
                tcm.addColumn(ic.column);
                int lastColumn = tcm.getColumnCount() - 1;
                if (ic.index < lastColumn)
    			{
                    tcm.moveColumn(lastColumn, ic.index);
                }
            }
        }
    
    
    /************************************************************************************************************************************************************/
    
    
    
        private static class IndexedColumn
    	{
    
            private Integer index;
            private TableColumn column;
    
            public IndexedColumn(Integer index, TableColumn column)
    		{
                this.index = index;
                this.column = column;
            }
        }
    
    
    /************************************************************************************************************************************************************/
    
    
        public static void main(String[] args) {
            String[] columnNames = {
                "Name", "Size", "Type", "Date Modified", "Permissions"
            };
            String[][] data = {
                {"bin", "2", "dir", "Jun 9", "drwxr-xr-x"},
                {"boot", "3", "dir", "Jun 9", "drwxr-xr-x"},
                {"dev", "6", "dir", "Jul 12", "drwxr-xr-x"},
                {"etc", "34", "dir", "Jul 12", "drwxr-xr-x"}
            };
            JTable table = new JTable(data, columnNames);
            table.setPreferredScrollableViewportSize(table.getPreferredSize());
            JScrollPane scrollPane = new JScrollPane(table);
            final TableColumnHider hider = new TableColumnHider(table);
            JPanel checkBoxes = new JPanel();
            for (int i = 0; i < columnNames.length; i++) {
                JCheckBox checkBox = new JCheckBox(columnNames[i]);
                checkBox.setSelected(true);
                checkBox.addActionListener(new ActionListener() {
    
                    @Override
                    public void actionPerformed(ActionEvent evt) {
                        JCheckBox cb = (JCheckBox) evt.getSource();
                        String columnName = cb.getText();
    
                        if (cb.isSelected()) {
                            hider.show(columnName);
                        } else {
                            hider.hide(columnName);
                        }
                    }
                });
                checkBoxes.add(checkBox);
            }
            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.getContentPane().add(scrollPane);
            frame.getContentPane().add(checkBoxes, BorderLayout.SOUTH);
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
    }
    
  • Re: Jframe jtable

    Per funzionare funziona, ma non ancora bene, quindi devo metterci le mani su e adattarlo al mio programma. e credo mi serva appunto inserire quel firestructurechanged mmh
    @EDIT:
    però questo listato qua ci ho fatto una classe a parte. stavo pensando di metterlo invece nel tablemodel così ci posso inserire i firetable
  • Re: Jframe jtable

    Comunque tornando agli enum, perché non mi fa passare il valore dell'enum displaymode nel metodo setdisplaymode?
  • Re: Jframe jtable

    KuroKami69 ha scritto:


    però questo listato qua ci ho fatto una classe a parte. stavo pensando di metterlo invece nel tablemodel così ci posso inserire i firetable
    No, la gestione del table model è una cosa, mentre la gestione dei TableColumn è un'altra cosa. E non le devi (dovresti) "mescolare".

    KuroKami69 ha scritto:


    Comunque tornando agli enum, perché non mi fa passare il valore dell'enum displaymode nel metodo setdisplaymode?
    Che vuol dire!??

    es.

    xyz.setDisplayMode(DisplayMode.MOTO_ONLY);

    Questo è il modo di invocare setDisplayMode. Potresti evitare il DisplayMode. solo se importassi con lo static import (che forse non conosci nemmeno) le tre costanti della enum.
  • Re: Jframe jtable

    
    public class FrameTabella extends JPanel 
    {
    	private AutomobileTableModel atb;
    	private JTable tb;
    	private JScrollPane p;
    	private JRadioButton auto;
    	private JRadioButton moto;
    	private JRadioButton both;
    	
    	public enum DisplayMode
    	{
       		AUTO_E_MOTO,
       		AUTO_ONLY,
       		MOTO_ONLY
    	}
    ......
    
    una cosa simile implica che il mio enum è di "tipo" FrameTabella vero? perché io ho anche questa parte
    
    public class AutomobileTableModel extends AbstractTableModel
    {
    private DisplayMode currentDisplayMode;
    ......
    ......
    public DisplayMode setDisplayMode(DisplayMode mode)
    	{
    		this.currentDisplayMode = mode;
    	}
    
    e quando compilo mi da questo errore
    
    .\FrameTabella.java:26: error: incompatible types: FrameTabella.DisplayMode cannot be converted to java.awt.DisplayMode
                    if (auto.isSelected ()) { atb.setDisplayMode(DisplayMode.AUTO_ONLY); return DisplayMode.AUTO_ONLY; }
                                                                            ^
    .\FrameTabella.java:27: error: incompatible types: FrameTabella.DisplayMode cannot be converted to java.awt.DisplayMode
                    else if (moto.isSelected ()) { atb.setDisplayMode(DisplayMode.MOTO_ONLY); return DisplayMode.MOTO_ONLY; }
                                                                                 ^
    .\FrameTabella.java:28: error: cannot find symbol
                    else { atb.setDisplayModee(DisplayMode.AUTO_E_MOTO); return DisplayMode.AUTO_E_MOTO; }
                              ^
      symbol:   method setDisplayModee(DisplayMode)
      location: variable atb of type AutomobileTableModel
    Note: Some messages have been simplified; recompile with -Xdiags:verbose to get
    full output
    3 errors
    
    il mio enum quindi può essere usato solo dentro al contesto FrameTabella se ho capito bene... che ho idea sia la cosa dello staric import che accennavi
  • Re: Jframe jtable

    KuroKami69 ha scritto:


    una cosa simile implica che il mio enum è di "tipo" FrameTabella vero?
    No, il tipo della tua enum è DisplayMode. E il fatto che l'hai "innestato" in FrameTabella è solo una scelta (delle varie possibili e nel tuo caso nemmeno la migliore!).

    KuroKami69 ha scritto:


    .\FrameTabella.java:26: error: incompatible types: FrameTabella.DisplayMode cannot be converted to java.awt.DisplayMode
    if (auto.isSelected ()) { atb.setDisplayMode(DisplayMode.AUTO_ONLY); return DisplayMode.AUTO_ONLY; }
    "Guarda caso" esiste in java.awt una classe (ripeto: CLASSE, non enum) che si chiama DisplayMode
    E ovviamente non c'entra niente con la tua enum DisplayMode.

    Quindi:
    a) se hai un import java.awt.DisplayMode; (perché magari te l'ha suggerito un IDE ... TOGLILO)
    b) se vuoi nessuno ti impedisce di cambiare il nome della tua enum es. ModoVisualizzazione

    KuroKami69 ha scritto:


    il mio enum quindi può essere usato solo dentro al contesto FrameTabella se ho capito bene...
    No, tecnicamente anche fuori da FrameTabella, purché ci siano gli import corretti. Chiaramente c'entra anche il livello di accesso. Ma FrameTabella è public e anche la tua DisplayMode è public. Quindi nessun problema dall'esterno. Ripeto: a patto di importare/referenziare le cose correttamente.

    KuroKami69 ha scritto:


    che ho idea sia la cosa dello staric import che accennavi
    No, lo "static import" è una funzionalità di Java 5 che permette di importare membri static. E nel caso di una enum ti permette di fare riferimento alle costanti della enum senza doverle qualificare con il tipo della enum.


    P.S. tutte queste "finezze", come vedi, non le sai/hai. Cerca di andare avanti, non mettere "carne al fuoco" ogni volta di più ... e finisci 'sta benedetta applicazione dei veicoli, magari anche se non viene super-efficiente/bellissima.
  • Re: Jframe jtable

    Difatti volevo finirla! grazie per le spiegazioni, in effetti dovrei imparare a leggere meglio i messaggi prima di correre troppo
    ora devo solo capire come fare per sistemare l'hider e magari nella colonna del colore metterci il colore vero e proprioanzichè la scritta... e il cerca ancora non mi dispiace, ma intanto finisco sta cosa e dopo vedo se fare aggiunte
  • Re: Jframe jtable

    Scusami, perdona la mia immensa ignoranza.
    ho consultato il manuale, ho cercato online, però continuo a non capire. se la mia classe enum l'ho definita dentro a framtabella, ed è public, perché non me la vede abstracttablemodel? l'ho rinominata Visualizza così non rischia di andare sopra a classi già esistenti. il package è sempre lo stesso visto che è tutto dentro un'unica cartella, quindi perché non me la vede? il costruttore delle enum è privato quindi non si deve istanziare. non mi sembra debba fargli import ecc, essendo parte dello stesso package, quindi cosa mi son perso?
  • Re: Jframe jtable

    KuroKami69 ha scritto:


    ho consultato il manuale, ho cercato online, però continuo a non capire. se la mia classe enum l'ho definita dentro a framtabella, ed è public, perché non me la vede abstracttablemodel? l'ho rinominata Visualizza così non rischia di andare sopra a classi già esistenti.
    Ascolta, non tirarti rogne, metti la enum con nome es. ModoVisualizzazione FUORI da FrameTabella, ovvero come enum a sé stante.

    KuroKami69 ha scritto:


    il package è sempre lo stesso visto che è tutto dentro un'unica cartella
    Le tue classi hanno la dichiarazione di package?

    KuroKami69 ha scritto:


    quindi cosa mi son perso?
    Purtroppo moltissimo, fino a quando non studierai seriamente ..
Devi accedere o registrarti per scrivere nel forum
230 risposte