Visualizzazione dei risultati da 1 a 8 su 8

Hybrid View

  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    339

    Evidenziare riga corrispondente a ricerca elemento in una JTable

    Ciao
    Premessa :

    Ho una JTable che rappresenta una TreeSet contenente Oggetti di tipo Articolo.

    In ogni cella c'è una stringa che rappresenta un campo dell'oggetto Articolo.

    Ogni riga della JTable rappresenta L'Articolo , ogni colonna il relativo campo (Tipologia , Marca , Modello ecc...).

    Ho implementato codice per evidenziare un elemento dopo aver fatto una ricerca.

    La ricerca consiste nello scrivere qualcosa in un JTextField per poi cercarlo premendo un tasto "Cerca". Il risultato sarà poi visualizzato sulla JTable attraverso la selezione automatica della riga relativa alla stringa cercata.

    Il Problema è che non sempre funziona ; Non funziona se ordino la JTable cioè se clicco sul titolo di una colonna per ordinarla. Se non faccio l'ordinamento funziona.

    Vi Posto il codice :
    Il Metodo che fa la ricerca nella TreeSet è corretto ho controllato.

    codice:
    
    
    codice:
     public int cercaArticolo(String testo){
    	int risultato = -1;
    	String tipologia = "" , marca = "" , modello = "" , quantità = "" , prezzo = "" , codice = "";
    	  Iterator<Articolo> it = treeset.iterator();
    		while(it.hasNext()){
    			Articolo art = it.next();
    			tipologia = art.getTipologia();
    			marca = art.getMarcaTipologia();
    			modello = art.getModelloTipologia();
    			quantità = String.valueOf(art.getQuantitàArticolo());
    			prezzo = String.valueOf(art.getPrezzo());
    			codice = String.valueOf(art.getCodiceArticolo());
    			
    			if(testo.equals(tipologia)||testo.equals(marca)||testo.equals(modello)||testo.equals(quantità)||testo.equals(prezzo)||testo.equals(codice)){
    				risultato = art.getCodiceArticolo();
    			break;
    			}
    				
    		}
    		return risultato;
    		
    	}// CERCA ARTICOLO


    Penso sia sbagliato qualcosa nell'ascoltatore del bottone cerca (Vi posto solo l'action performed)

    codice:
    
    
    codice:
    public void actionPerformed(ActionEvent e){
    		
      String elementoDaCercare = new String(InterfacciaPrincipale.campoRicerca.getText());
      int risultato = InterfacciaPrincipale.Magazzino.cercaArticolo(elementoDaCercare);
    	if(risultato == -1)
    			new NotificaNessunArticoloPresente();
    		else{
    			for(int row = 0 ; row <= InterfacciaPrincipale.modelloJTable.getRowCount() - 1; row++){
    				for(int col = 0 ; col <= InterfacciaPrincipale.modelloJTable.getColumnCount() -1 ; col++){
    					if(elementoDaCercare.equals(InterfacciaPrincipale.modelloJTable.getValueAt(row, col)))
    						InterfacciaPrincipale.Jtable.setRowSelectionInterval(row, row);
    						
    				}//FOR 2
    			}//FOR 1
    	
    		}// ELSE
    				
    	}// ACTION PERFORMED



  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Markus85 Visualizza il messaggio
    Il Problema è che non sempre funziona ; Non funziona se ordino la JTable cioè se clicco sul titolo di una colonna per ordinarla. Se non faccio l'ordinamento funziona.
    Gli indici di riga/colonna nel "model" generalmente sono "stabili", nel senso che non cambiano (a meno che sia il table model stesso ad essere "mutabile" o comunque a poter cambiare struttura radicalmente, es. nel numero/ordine delle colonne). Ma il cambiamento è comunque programmatico, cioè è la applicazione che può essere fatta in modo da cambiare radicalmente il model .... non è detto che centri direttamente l'utente.

    Gli indici di riga/colonna nella "view", ovvero quello che si vede in JTable, possono differire da quelli nel model. Gli indici di colonna possono differire se l'utente trascina e riordina le colonne (e questa feature non viene disabilitata). E se c'è implementato un qualche ordinamento, pure gli indici di riga possono differire.

    In sostanza, usare gli indici del model:

    for(int row = 0 ; row <= InterfacciaPrincipale.modelloJTable.getRowCount() - 1; row++){
    if(elementoDaCercare.equals(InterfacciaPrincipale.modelloJTable.getValueAt(row, col)))

    e poi usarli nella view:

    InterfacciaPrincipale.Jtable.setRowSelectionInterval(row, row);

    è "potenzialmente" causa di errori/discrepanze.

    Per questo, JTable ha metodi appositi di "traslazione" degli indici quali convertColumnIndexToModel, convertColumnIndexToView, ecc...


    P.S. fare accessi con es.:

    InterfacciaPrincipale.campoRicerca.getText()
    InterfacciaPrincipale.Jtable.setRowSelectionInterval

    ovvero campi statici e pubblici di dati o addirittura componenti grafici, denota un pessimo design delle classi. Mi spiace ma è così ...
    Ultima modifica di andbin; 20-05-2014 a 19:14
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    339
    Potresti propormi qualche soluzione ?

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    339
    Quote Originariamente inviata da andbin Visualizza il messaggio

    Per questo, JTable ha metodi appositi di "traslazione" degli indici quali convertColumnIndexToModel, convertColumnIndexToView, ecc...
    Dove vanno applicati questi metodi?
    Sugli indici?

    P.S. fare accessi con es.:

    InterfacciaPrincipale.campoRicerca.getText()
    InterfacciaPrincipale.Jtable.setRowSelectionInterval

    ovvero campi statici e pubblici di dati o addirittura componenti grafici, denota un pessimo design delle classi. Mi spiace ma è così ...
    Mi butti a terra... :-) :-)

    Quale soluzione avrei dovuto adottare?

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Markus85 Visualizza il messaggio
    Dove vanno applicati questi metodi?
    Sugli indici?
    Sì, sugli indici ovviamente. I metodi di traslazione offerti da JTable servono in alcune precise circostanze (non sto a fare esempi adesso). Però nel tuo caso non è detto che servono.

    Nota che nel tuo codice hai usato getValueAt sul table model (quindi riga/colonna sono nel "model") e poi hai usato quella riga per setRowSelectionInterval di JTable, che ovviamente è nella "view".

    È questo che può portare a discrepanze. Se un valore lo trovi alla riga 10 nel model ..... se c'è un ordinamento sulla tabella, non è detto che si trovi fisicamente sulla riga 10 nella vista in JTable!

    La soluzione è semplice e non implica necessariamente l'uso esplicito dei metodi di traslazione: semplicemente usa getRowCount / getColumnCount / getValueAt di JTable.

    Quote Originariamente inviata da Markus85 Visualizza il messaggio
    Mi butti a terra... :-) :-)
    Beh no dai ... non era quello l'obiettivo!

    Quote Originariamente inviata da Markus85 Visualizza il messaggio
    Quale soluzione avrei dovuto adottare?
    Il punto è che serve avere ben chiari i principi della OOP e magari anche alcuni dei più noti e comuni design pattern. Tanto per dirne una, se la funzionalità di ricerca nella tabella è da fare su più tabelle distinte, magari presenti in pannelli/finestre differenti, a me già verrebbe in mente di estendere JTable e incapsulare lì dentro la logica di ricerca.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    339
    Quote Originariamente inviata da andbin Visualizza il messaggio
    La soluzione è semplice e non implica necessariamente l'uso esplicito dei metodi di traslazione: semplicemente usa getRowCount / getColumnCount / getValueAt di JTable.
    Non ho capito ; getRowCount / getColumnCount li ho utilizzati nei for , getValueAt l'ho usato pure.

    codice:
    public void actionPerformed(ActionEvent e){
    		
    String elementoDaCercare = new String(InterfacciaPrincipale.campoRicerca.getText());
    int risultato = InterfacciaPrincipale.Magazzino.cercaArticolo(elementoDaCercare);
     if(risultato == -1)
      new NotificaNessunArticoloPresente();
        else{
         for(int row = 0 ; row <= InterfacciaPrincipale.modelloJTable.getRowCount() - 1; row++){
    	for(int col = 0 ; col <= InterfacciaPrincipale.modelloJTable.getColumnCount() -1 ; col++){
    	   if(elementoDaCercare.equals(InterfacciaPrincipale.modelloJTable.getValueAt(row, col)))
    		InterfacciaPrincipale.Jtable.setRowSelectionInterval(row, row);
    						
    				}//FOR 2
    			}//FOR 1
    	}// ELSE				
    }// ACTION PERFORMED
    Cioè vuoi dire che invece di setRowSelectionInterval devo utilizzare getValueAt per selezionare la riga?

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    339
    Aspetta Aspetta....Ho capito.
    Io invocavo metodi su modelloJTable e su Jtable anzichè invocarli su uno solo dei due

    Cosi adesso mi funziona , anche se ordino la JTable

    publicvoid actionPerformed(ActionEvent e){

    String elementoDaCercare =newString(InterfacciaPrincipale.campoRicerca.getText());
    int risultato =InterfacciaPrincipale.Magazzino.cercaArticolo(elementoDaCercare);
    if(risultato ==-1)
    newNotificaNessunArticoloPresente();
    else{
    for(int row =0; row <=InterfacciaPrincipale.Jtable.getRowCount()-1; row++){
    for(int col =0; col <=InterfacciaPrincipale.Jtable.getColumnCount()-1; col++){
    if(elementoDaCercare.equals(InterfacciaPrincipale.Jtable.getValueAt(row, col)))
    InterfacciaPrincipale.Jtable.setRowSelectionInterval(row, row);

    }//FOR 2
    }//FOR 1
    }// ELSE
    }// ACTION PERFORMED

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.