Jframe jtable

di il
230 risposte

230 Risposte - Pagina 6

  • Re: Jframe jtable

    andbin ha scritto:


    KuroKami69 ha scritto:


    l'idea di creare la lista di auto nel tablemodel è essenzialmente sbagliata vero?
    Sì, è sbagliata.
    Nel table model, in generale (e senza motivazioni ben precise):
    - non devi tenere riferimenti a JTable
    - non deve tenere altri componenti (come quel JButton)
    - non devi gestire listener di altri componenti (quel ActionListener)
    - non devi "creare" nuovi elementi

    In post ti ho fatto vedere come fare un aggiungiAutomobile.
    Ma puoi aggiungere tutti i metodi di "modifica" che vuoi.

    Es.
    rimuoviAutomobile(int index) (rimuove l'automobile all'indice)
    rimuoviAutomobili() (rimuove tutte le automobili)
    impostaAutomobili(List<Automobile> automobili) (re-imposta tutta la lista)
    ecc...

    Questi metodi di modifica sono per te che vuoi usare "programmaticamente" il table model. NON sono per JTable.
    In questi metodi bisogna fare sostanzialmente 2 cose:
    - aggiornare la struttura dati (ovviamente)
    - invocare il/i fireXXX di AbstractTableModel appropriato/i per notificare ai listener in modo accurato quella modifica apportata dal metodo.
    onestamente non mi ricordavo proprio quel metodo, non son riuscito, evidentemente, a lasciar perder fino alla fine il voler creare elementi estranei al tablemodel.
    sono una zucca de coccio ma già lo avevo detto/dimostrato...
    quindi, ora visto che sembra che io non abbia capito nulla, il valore dello spinner, e la conseguente lista/array di automobili che mi vado a creare, in che file la devo mettere? mi son creato un file tabella dove modifico alcuni valori della tabella, tipo il colore delle righe e la loro editabilità, e altre cose. metto qua oppure nel main la lista con i costruttori delle auto e il valore ricavato dallo spinner?
  • Re: Jframe jtable

    KuroKami69 ha scritto:


    il valore dello spinner, e la conseguente lista/array di automobili che mi vado a creare, in che file la devo mettere?
    Per il momento, i componenti (spinner ecc..) e le implementazioni dei listener tienili nella classe del frame. A seguito di eventi e quant'altro andrai a "parlare" con il table model per dirgli quali modifiche apportare. Ma devi appunto scegliere quali metodi speciali implementare nel table model per offrire (a te stesso, visto che il table model lo implementi e usi sempre tu) per permettere le modifiche.
  • Re: Jframe jtable

    Per metodi speciali intendi il fire ecc?
    comunque d'accordo, allora come prima cosa finisco il tutto e vedo di far in modo che mi carichi una lista con un numero di righe preimpostato, poi implementerò l'uso dei vari componenti del frame
  • Re: Jframe jtable

    Scusatemi, una domanda forse stupida
    volevo avere solo al classe salone.java contenente il main con la creazione della tabella e basta
    così ho fatto una nuova classe frametabella dove ho copiato tutto il codice del frame, funzionante, che però non funziona
    potreste dirmi come mai per favore?
    
    public static class FrameTabella
    {
    	JFrame jf = new JFrame("Lista Veicoli");
    	JLabeel 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();
    			//atm.getRowCount(i);
    		}
    	});
    	
    	/*js.addChangeListener(new ChangeListener() //questo listener vede i cambiamenti nello spinner
    	{
    		public void stateChanged(ChangeEvent e)
    		{
    			Object i = ((JSpinner)e.getSource()).getValue();
    			//JOptionPane.showMessageDialog(null, "hai digitato " + ((JSpinner)e.getSource()).getValue(), "allert", JOptionPane.INFORMATION_MESSAGE);
    			JOptionPane.showMessageDialog(null, i);
    		}
    	});*/
    	JPanel p = new JPanel();
    	
    	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	add(p);
    	add(jl);
    	add(js);
    	add(b);
    	add(jl1);
    	add(auto); p.add(moto); p.add(both);
    	add(cb);
    	pack();
    	setVisible(true);
    	
    }
    
    sicuramente avrò fatto qualcosa che non dovevo fare :/ non capisco cosa però
    ho provato a fare sia extends JTable sia implements JTABLE ma non funziona. ho provato a cercare su internet e ho fatto la classe statica, non funziona
    gli errori sono tutti simili
    
    .\FrameTabella.java:15: error: <identifier> expected
            auto.setSelected(true);
                            ^
    
    è abbastanza evidente che il funzionamento non è lo stesso del main... quindi cosa c'è di differente?

    EDIT:
    ho capito, deve andare tutto nel metodo costruttore

    EDIT2:
    perché non mi riconosce queste 2 righe?
    
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    pack();
    
    
    .\FrameTabella.java:14: error: cannot find symbol
                    setDefaultCloseOperation(EXIT_ON_CLOSE);
                                             ^
      symbol:   variable EXIT_ON_CLOSE
      location: class FrameTabella
    .\FrameTabella.java:87: error: cannot find symbol
                    pack();
                    ^
      symbol:   method pack()
      location: class FrameTabella
    2 errors
    
    lo hai messo anche te nel costruttore il setdefault ecc quindi perché con me è così pignolo? ho importato awt e swing... non capisco perché non mi vede il pack poi mmh attualmente la mia classe estende jframe quindi dovrebbe funzionare no?

    EDIT3:
    comunque ora mi ucciderete, ma io uso dreamweaver cs6 per buttare giù codice, di conseguenza non ho nessun aiuto da parte dell'editor
  • Re: Jframe jtable

    KuroKami69 ha scritto:


    Per metodi speciali intendi il fire ecc?
    No! I vari aggiungiAutomobile, rimuoviAutomobile ecc... che te li devi "inventare" tu secondo le esigenze che noti nell'uso del table model.
    L'uso dei fireXXX è conseguente all'interno di questi metodi.

    KuroKami69 ha scritto:


    sicuramente avrò fatto qualcosa che non dovevo fare :/ non capisco cosa però
    Ma è tutto abbastanza sbagliato, oltre che confuso. Stai pure mettendo istruzioni es. auto.setSelected(true); direttamente al livello di classe (no! vanno messe in metodi)

    Ti serve STUDIARE Java su un bel valido libro !!!

    KuroKami69 ha scritto:


    comunque ora mi ucciderete, ma io uso dreamweaver cs6 per buttare giù codice, di conseguenza non ho nessun aiuto da parte dell'editor
    Arrrrgggghhhhhhh!
  • Re: Jframe jtable

    Ho capito che mi serve studiare! E lo farò! Ma si impara anche sbagliando! E quindi sarei felice se potessi dirmi come mai quelle 2 istruzioni che ho messo non vanno, per favore
  • Re: Jframe jtable

    Mi arrendo. non ci capisco nulla.
    perché, per quale immane motivo, non mi vede automobili dentro al getValueAt???
    
    import javax.swing.*;
    import java.awt.*;
    import java.util.ArrayList;
    import javax.swing.table.AbstractTableModel;
    import java.util.List;
    
    public class AutomobileTableModel extends AbstractTableModel
    {
    	private static final String colonne[] = {"Marca", "Modello", "Stato", "Prezzo", "Tipo", "Colore", "KM", "Anno Imm.", "Scadenza Bollo", "Targa", "Posti", "Portiere", "Bagagliaio", "Cilindrata", "Cilindri", "Cavalli", "Peso/Potenza", "Alimentazione", "Consumo", "Trazione", "Cambio", "Marce", "Lunghezza", "Massa a Vuoto", "Altezza Car.", "Tettuccio"};
    	
    	private static final Class<?>[] tipiColonne = {String.class, String.class, String.class, Integer.class, String.class, String.class, Integer.class, String.class, Integer.class, String.class, Integer.class, Integer.class, Integer.class, Integer.class, Integer.class, Integer.class, Double.class, String.class, Integer.class, String.class, Integer.class, Integer.class, Double.class, Integer.class, Double.class, String.class};
    	
    	private List<Automobili> automobili;
    	
    	public AutomobileTableModel(List<Automobili> automobili)
    	{
    		this.automobili = automobili;
    	}
    	
    	@Override
    	public int getRowCount()
    	{
    		return automobili.size();
    	}
    	
    	@Override
    	public int getColumnCount()
    	{
    		return colonne.length;
    	}
    	
    	@Override
    	public Class<?> getColumnClass(int columnIndex)
    	{
    		 return tipiColonne[columnIndex];
    	}
    	
    	@Override
    	public String getColumnName (int columnIndex)
    	{
    		return colonne[columnIndex];
    	}
    	
    	@Override
    	public Object getValueAt(int rowIndex, int columnIndex)
    	{
    		Automobili automobili = automobili.get(rowIndex);
    		
    		switch(columnIndex)
    		{
    			case 0 = return automobili.getMarca();
    			case 1 = return automobili.getModello();
    			case 2 = return automobili.getStato();
    			case 3 = return automobili.getPrezzo();
    			case 4 = return automobili.getTipo();
    			case 5 = return automobili.getColore();
    			case 6 = return automobili.getKm();
    			case 7 = return automobili.getAnnoImmatricolazione();
    			case 8 = return automobili.getScadenzaBollo();
    			case 9 = return automobili.getTarga();
    			case 10 = return automobili.getPosti();
    			case 11 = return automobili.getPortiere();
    			case 12 = return automobili.getBagagliaio();
    			case 13 = return automobili.getCilindrata();
    			case 14 = return automobili.getCilindri();
    			case 15 = return automobili.getCavalli();
    			case 16 = return automobili.getRapportoPP();
    			case 17 = return automobili.getMotore();
    			case 18 = return automobili.getConsumo();
    			case 19 = return automobili.getTrazione();
    			case 20 = return automobili.getCambio();
    			case 21 = return automobili.getMarce();
    			case 22 = return automobili.getLunghezza();
    			case 23 = return automobili.getMassaVuoto();
    			case 24 = return automobili.getAltezzaTerra();
    			case 25 = return automobili.getTettuccio();
    			default return null;
    		}
    	}
    }
    
    perché porca paletta santa non mi riconosce il metodo set? l'ho chiamato nel costruttore, come hai fatto te, però a me da un dannatissimo errore e non capisco perchè si genera. il pack è un metodo di jframe, se non ho letto male io, quindi perchè non lo posso richiamare nel costruttore della classe? perchè porca miseriaccia, dopo che ho creato la lista di automobili, non mi vede il comando add?? e perchè fa come se la mia classe Automobili non esistesse??
    
    import javax.swing.*;
    import javax.swing.event.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.util.ArrayList;
    import java.util.List;
    
    public class FrameTabella extends JTable
    {
    	List<Automobili> automobili = new ArrayList<Automobili>();
    	automobili.add(new Automobili());
    	
    	private AutomobileTableModel tb = new AutomobileTableModel(automobili);
    	private JScrollPane p = new JScrollPane();
    	
    	public FrameTabella()
    	{
    		JFrame jf = new JFrame("Lista Veicoli");
    		JLabel jl = new JLabel("Inserisci il numero di veicoli da visualizzare");
    		JLabel jl1 = new JLabel("Scegli cosa visualizzare");
    		
    		//setDefaultCloseOperation(EXIT_ON_CLOSE);
    	
    		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();
    				//atm.getRowCount(i);
    			}
    		});
    	
    		/*js.addChangeListener(new ChangeListener() //questo listener vede i cambiamenti nello spinner
    		{
    			public void stateChanged(ChangeEvent e)
    			{
    				Object i = ((JSpinner)e.getSource()).getValue();
    				//JOptionPane.showMessageDialog(null, "hai digitato " + ((JSpinner)e.getSource()).getValue(), "allert", JOptionPane.INFORMATION_MESSAGE);
    				JOptionPane.showMessageDialog(null, i);
    			}
    		});*/
    	
    		add(p);
    		add(jl);
    		add(js);
    		add(b);
    		add(jl1);
    		add(auto); p.add(moto); p.add(both);
    		add(cb);
    		//pack();
    		setVisible(true);
    	}
    }
    
    non sto dicendo che non voglio studiare. e nemmeno che non abbia provato a cercare una spiegazione a questi errori. non l'ho trovata.
    è chiaro che sono abbastanza ignorante, ma ho voglia di imparare, facendo pratica per il momento. voglio capire PERCHE' sbaglio, e COSA. e dopo averci perso ieri e oggi a cercare di capire questa funzione, devo dire che nonostante il concetto sia chiaro, non è chiaro quello che ci posso fare. la mia ignoranza è emersa quando ho provato a fare un jframe direttamente nella classe, però ho capito lo sbaglio. ciò non significa che ho capito tutto. e questa cosa mi sta facendo andare via di testa
    posso chiedervi il favore di dirmi dove sbaglio e perchè sbaglio per piacere?
  • Re: Jframe jtable

    KuroKami69 ha scritto:


    Automobili automobili = automobili.get(rowIndex);
    Stai usando lo stesso nome! E non va bene.

    Meglio fare.

    Automobili automobile = automobili.get(rowIndex);

    KuroKami69 ha scritto:


    public class FrameTabella extends JTable
    Non ha assolutamente senso il extends di JTable
  • Re: Jframe jtable

    KuroKami69 ha scritto:


    facendo pratica per il momento.
    La questione è che un approccio del genere, fatto senza avere "basi" valide è molto "pericoloso". Perché ti porta a fare errori 100 volte di più rispetto a quanto sarebbe lecito/sensato per chi inizia. E non solo errori .... erroracci. E probabilmente tutti questi ti creano solo ancora più confusione.

    Quindi la soluzione è semplice: si deve STUDIARE dalle basi. Non basta "provare" a caso a buttare giù del codice, rimaneggiarlo 20 volte in 10 modi diversi ...
  • Re: Jframe jtable

    andbin ha scritto:


    KuroKami69 ha scritto:


    Automobili automobili = automobili.get(rowIndex);
    Stai usando lo stesso nome! E non va bene.

    Meglio fare.

    Automobili automobile = automobili.get(rowIndex);

    KuroKami69 ha scritto:


    public class FrameTabella extends JTable
    Non ha assolutamente senso il extends di JTable
    perché non ha senso estendere JTable?

    EDIT: perché se sto facendo il frame non ha senso estendere JTable vero ._. e quindi ecco spiegato perché non mi vedeva ne il pack() ne il setecc.... errore quantomai stupido ._.
  • Re: Jframe jtable

    Perché mi escono questi errori?
    
    .\AutomobileTableModel.java:51: error: illegal start of expression
                            case 0 = return automobile.getMarca();
    
    \AutomobileTableModel.java:51: error: unexpected type
                           case 0 = return automobile.getMarca();
                                ^
     required: variable
     found:    value
    \AutomobileTableModel.java:52: error: unexpected type
                           case 1 = return automobile.getModello();
                                ^
     required: variable
     found:    value
    
    voglio dire, è la stessa cosa che hai scritto te no?
    perché quando metto a commento il metodo getvalueat, compilo, tolgo il commento e ricompilo non mi da più quegli errori? ._.
  • Re: Jframe jtable

    KuroKami69 ha scritto:


    perché non ha senso estendere JTable?
    Tra l'altro tu hai fatto:
    public class FrameTabella extends JTable
    {
       List<Automobili> automobili = new ArrayList<Automobili>();
       automobili.add(new Automobili());
       
       private AutomobileTableModel tb = new AutomobileTableModel(automobili);
       private JScrollPane p = new JScrollPane();
       
       public FrameTabella()
       {
          JFrame jf = new JFrame("Lista Veicoli");
    Ma questo "jf" NON l'hai usato da alcuna parte! Quindi: a) a che serve? b) vuoi che FrameTabella è-un frame (estende JFrame cioè) oppure no?

    Questi sono aspetti di "design" e .... NON ti sono chiari.

    KuroKami69 ha scritto:


    Perché mi escono questi errori?
    case 0 = return automobile.getMarca();
    case X:

    NON case X=

    Queste sono BASI ultra importanti. Vanno sapute, non puoi cascare su queste!!
  • Re: Jframe jtable

    
    .\FrameTabella.java:11: error: package automobile does not exist
            automobile.add(new Automobili());
    
    in che senso? se questa cosa la faccio nel main non mi da problemi, perché qua si?
  • Re: Jframe jtable

    andbin ha scritto:


    KuroKami69 ha scritto:


    perché non ha senso estendere JTable?
    Tra l'altro tu hai fatto:
    public class FrameTabella extends JTable
    {
       List<Automobili> automobili = new ArrayList<Automobili>();
       automobili.add(new Automobili());
       
       private AutomobileTableModel tb = new AutomobileTableModel(automobili);
       private JScrollPane p = new JScrollPane();
       
       public FrameTabella()
       {
          JFrame jf = new JFrame("Lista Veicoli");
    Ma questo "jf" NON l'hai usato da alcuna parte! Quindi: a) a che serve? b) vuoi che FrameTabella è-un frame (estende JFrame cioè) oppure no?
    giustamente, se il mio frame lo sto creando, non ha senso costruirne un altro dentro, hai ragione

    andbin ha scritto:


    Questi sono aspetti di "design" e .... NON ti sono chiari.

    KuroKami69 ha scritto:


    Perché mi escono questi errori?
    case 0 = return automobile.getMarca();
    case X:

    NON case X=

    Queste sono BASI ultra importanti. Vanno sapute, non puoi cascare su queste!!
    il padano che è in me sta uscendo imponente.
    non mi ero minimamente accorto degli uguali. nella mia testa io vedevo tutto ":", perché quando facevo php l'ho usato così spesso da farmi venire la nausea (più che altro per giocare non per farci roba seria). e non mi ero minimamente reso conto che c'eran degli uguali. nonostante lo abbia letto 20 volte ._.
    quando son nervoso è meglio che smetto di dedicarmi a 'ste cose per un po' ._.
    ti ringrazio per queste correzioni e per la pazienza che stai avendo con me
  • Re: Jframe jtable

    
    List<Automobili> auto = new ArrayList();
    	auto.add(new Automobili());
    
    ho importato sia arraylist che list.
    la mia classe automobili si chiama Automobili.
    quindi perché non gli piace?
    non capisco :/
Devi accedere o registrarti per scrivere nel forum
230 risposte