Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2011
    Messaggi
    30

    creare diverse JTable appoggiate a AbstractTableModel

    Salve a tutti!
    Avrei bisogno di un aiuto devo creare un'applicazione utilizzando il pattern MVC che gestisca delle prenotazioni. Devo visualizzare 2 finestre: una principale e una di dettaglio..nella finestra principale ho messo una tabella di 4 colonne e per le righe la dimensione del file che leggo. Nell'altra finestra devo creare un'altra tabella con 20 righe e 20 colonne. Ho creato una nuova vista dove creo la mia JTable ma mi serve appoggiarmi ad un modello che estenza AbstractTableModel giusto??(per dire metti 20 righe e 20 colonne). Mica posso crerare un altro modello che estenda di nuovo AbstractTable Model..! Vi prego aiutatemi"" Grazie e tutti""

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,327
    ma mi serve appoggiarmi ad un modello che estenza AbstractTableModel giusto??(per dire metti 20 righe e 20 colonne). Mica posso crerare un altro modello che estenda di nuovo AbstractTableModel..!
    Eh? Sei riuscito a dire una cosa ed il suo contrario nel giro di due frasi consecutive...

    Cerca di spiegarti meglio.

    Quando costruisci una JTable devi agganciare ad essa un TableModel. Che tu estenda AbstractTableModel o DefaultTableModel, che tu decida di usare direttamente il DefaultTableModel o che tu ti crei una tua classe che implementa TableModel, alla JTable non fa né caldo, né freddo... sta a te decidere coem procedere in base alle tue esigenze...


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2011
    Messaggi
    30
    Ciao!! Ok scusami mi sono spiegato male
    Allora ti posto il codice così forse sono più chiaro:
    Questo è il mio modello principale: (poi ci sono altre 2 classi esterne Room e Prenotazioni)
    codice:
    public class BookingModel extends AbstractTableModel {
    	private List<Room> rooms;
    	private List<Prenotazioni> prenotazioni;
    
    
    	public BookingModel() {
    		rooms=new ArrayList<Room>();
    		prenotazioni=new ArrayList<Prenotazioni>();
    		
    		try{
    			File filePrenotazioni=new File("sale.csv");
    			BufferedReader reader=new BufferedReader(new FileReader(filePrenotazioni));
    
    			String line=null;
    			while((line=reader.readLine())!=null){
    				System.out.println(line);
    				Scanner s=new Scanner(line).useDelimiter(",");
    				if(s.hasNext()){
    					String nome=s.next();
    					int capienza=s.nextInt();
    					boolean videoproiettorePresente;
    					if (s.next().equals("V")) {
    						videoproiettorePresente = true;
    					} else {			// se non è V(presente) è sicuramente N (non presente)
    						videoproiettorePresente = false;
    					}
    					System.out.println("I token delle prenotazioni sono "+nome+capienza+videoproiettorePresente);
    
    					Room newRoom=new Room(nome,capienza,videoproiettorePresente);
    					rooms.add(newRoom);
    
    				}
    
    			}
    
    		}catch(Exception e){
    		}
    
    		System.out.println("La dimensione della mia lista di Room è: "+rooms.size());
    		
    		try{
    			File filePrenotazioni=new File("prenotazioni.csv");
    			BufferedReader reader=new BufferedReader(new FileReader(filePrenotazioni));
    			
    			String line=null;
    			while((line=reader.readLine())!=null){
    				System.out.println(line);
    				Scanner s=new Scanner(line).useDelimiter(",");
    				if(s.hasNext()){
    					String nomeSala=s.next();
    					int giornoPrenotazione=s.nextInt();
    					String nomeConferenziere=s.next();
    					System.out.println("I token delle prenotazioni sono "+nomeSala+giornoPrenotazione+nomeConferenziere);
    
    				Prenotazioni newPren=new Prenotazioni(nomeSala,giornoPrenotazione,nomeConferenziere);
    				prenotazioni.add(newPren);
    				}
    				
    				
    			}
    			
    		}catch(Exception e){
    			
    		}
    		
    		System.out.println("La dimensione della mia lista di Prenotazioni è: "+prenotazioni.size());
    
    	}
    	
    	
    	@Override
    	public int getColumnCount() {
    		// TODO Auto-generated method stub
    		return 4;
    	}
    
    	@Override
    	public int getRowCount() {
    	return rooms.size();
    	}
    
    	@Override
    	public Object getValueAt(int r, int c) {		
    		Room sala=rooms.get(r);
    		Prenotazioni pren=prenotazioni.get(r);
    		
    		if (sala!=null){
    			switch (c){							//
    			case 0:
    				return sala.getNome();
    			case 1:
    				return sala.getCapienza();
    			case 2:
    				return sala.isVideoproiettorePresente();
    			case 3:
    			//	return pren.getNumPrenotazioni();
    
    			
    			}
    			
    		}
    		return new String();
    		
    	}
    	
    	@Override
    	public boolean isCellEditable(int r,int c){
    		return(true);
    	}
    	
    	
    	@Override
    	public void setValueAt(Object o, int r, int c){
    	this.fireTableDataChanged();		
    	}
    	
    	public String getColumnName(int c){
    		return Room.colonne[c];
    		
    	}
    }
    Questa e la View:
    codice:
    public class RoomView extends JPanel implements ListSelectionListener {
    private BookingModel bmodel;	
    private JTable tab;
    private JButton salva;
    
    
    	public RoomView(BookingModel bm){
    		
    		this.bmodel=bm;
    		RoomController rc=new RoomController(bmodel, this);
    		setLayout(new BorderLayout());
    		
    		//Pannello della tabella
    		tab=new JTable(bmodel);
    		tab.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    		tab.getSelectionModel().addListSelectionListener(this);
    		this.add(new JScrollPane(tab), BorderLayout.CENTER);
    		
    		salva=new JButton(rc.getSalvaAct());
    		this.add(salva,BorderLayout.SOUTH);
    		}
    
    	@Override
    	public void valueChanged(ListSelectionEvent arg0) {
    		int row = tab.getSelectedRow();
    	
    		
    	}
    		
    }
    Con questa view e quel modello riesco a visualizzare una finestra con all'interno una tabella di 4 colonne. Bene..ora selezionando una riga di questa tabella devo poter visualizzare una nuova finestra contenente una tabella di 365 celle(che sarebbe una sorta di calendario dove all'interno metto il numero di ogni gg dell'anno). Mi sono spiegato meglio? Come posso fare questa cosa?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Fire_89
    Questo è il mio modello principale:
    Grosso modo come struttura dei metodi è ok. Ma ...

    Punto 1) sarebbe abbastanza discutibile il fatto che il caricamento dei dati da file viene fatto dal model stesso e oltretutto nel costruttore.

    Punto 2) Da isCellEditable fai restituire true, quindi le celle sono modificabili. Devi quindi implementare opportunamente il setValueAt. Non basta (ed anzi non va usato) il fireTableDataChanged. Devi aggiornare la tua struttura dati (nell'oggetto e proprietà che riga/colonna indicano) e poi fare un fireTableCellUpdated(riga, colonna).

    Originariamente inviato da Fire_89
    ora selezionando una riga di questa tabella devo poter visualizzare una nuova finestra
    Non importa ora tanto che cosa fai alla selezione ... prima bisogna vedere come intendi "sentire" la selezione!

    Le possibilità in genere sono diverse (e alcune si possono anche combinare insieme):

    1) Far qualcosa con la selezione quando si preme un pulsante. Basta registrare un ActionListener sul pulsante e all'evento andare a vedere quale è la riga selezionata nella tabella ( getSelectedRow() ).

    2) Far qualcosa quando la selezione cambia. Basta registrare un ListSelectionListener sul ListSelectionModel che il JTable ha. Da JTable getSelectionModel() che fornisce il ListSelectionModel e poi su questo si può registrare il ListSelectionListener. All'evento si va a vedere quale è la nuova riga selezionata (sempre getSelectedRow() ).

    3) Far qualcosa quando avviene un evento del mouse sulla tabella. Questo è più a basso livello ma permetterebbe ad esempio di gestire un "doppio-click" su una riga. Si registra un MouseListener sulla tabella, nel mouseClicked si controlla pulsante e/o N-click e se quanto voluto allora:
    - il MouseEvent fornisce il Point con getPoint().
    - con il Point si usa rowAtPoint(Point) di JTable per conoscere la riga.

    In tutti questi 3 casi arrivi ad ottenere la riga "scelta". Con quella puoi prendere eventualmente i dati (o l'oggetto del "record") dal model e fare quello che vuoi.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.