Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    JTable - copiare dati da una JTable ad un'altra, con condizione.

    Avrei la seguente esigenza, se qualcuno volesse aiutarmi. Un pò di pazienza che sono un neofita.

    Ho un frame1 con una JTable1 popolata.

    Ho un altro frame2 contenente un Button ed un altra JTable2.

    Dovrei implementare un metodo che

    1) cerchi una data stringa nella tabella del primo frame (in una colonna specifica)

    2) popoli la seconda JTable (frame2) utilizzando i dati contenuti nella riga dove risulta presente la stringa, saltando le altre righe.

    Non mi interessa il codice, vorrei capire concettualmente come implementarlo.

    Io avrei pensato ad un ciclo for che mi permettesse di leggere i dati dalla prima tabella:

    for (int i = 0; i < table.getJTable().getRowCount(); i++) {
    if (table1.getJTable().getValueAt(i, 0) != null) {
    index = i;
    }
    }
    Memorizzare i dati nelle variabili stringa.
    String campo2 = (String) frame1.getJTable().getValueAt(i, 0);
    String campo2 = (String) frame1.getJTable().getValueAt(i, 1);
    String campo3 = (String) frame1.getJTable().getValueAt(i, 2);

    Adesso dovrei capire come copiare i dati relativi alle righe contenenti la stringa, nella seconda Jtable2.

    Un'altra domanda:
    E' corretta la seguente sintassi:
    String stringaDaCercare = (String) frame1.getJTable.getValueAt(i,9);
    stringaDaCercare.equals("stringaaCercare");?

  2. #2
    Qualcuno potrebbe darmi qualche dritta su quale algoritmo utilizzare?


    Questo è il metodo che avevo cominciato a scrivere. E' la strada giusta?

    codice:
    public void writeTable() {
    
            for (int row = 0; row <= main.getJTable().getRowCount(); row++) {
                for (int col = 0; col <= main.getJTable().getColumnCount(); col++) {
                    String find = (String) main.getJTable().getModel().getValueAt(row, 10).toString();
    
                    if (find.equals("testoDaCercare")) {
    
                        index = row;
                        for (int i = 0; i < this.getTable().getRowCount(); i++) {
                            if (this.getTable().getValueAt(i, 0) == null) {
                                index1 = i;
                            }
                       
                        }
     //main.getJTable() è il riferimento alla tabella origine del primo frame
           
                this.getTable().setValueAt(main.getJTable().getValueAt(index, 0), index1, 0);
                this.getTable().setValueAt(main.getJTable().getValueAt(index, 1), index1, 1);
                this.getTable().setValueAt(main.getJTable().getValueAt(index, 2), index1, 2);
                this.getTable().setValueAt(main.getJTable().getValueAt(index, 3), index1, 3);
    Grazie
    Ultima modifica di marcotto68; 30-12-2013 a 00:15

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Non so se ho capito bene la problematica, provo a riassumerla: hai due tabelle, entrambe devono visualizzare lo stesso tipo di dati, ma la seconda deve visualizzare un "sottoinsieme" dei dati della prima tabella, ovvero solo i dati della prima tabella che in un determinato campo hanno il valore cercato.

    Se è così, un metodo per risolvere il problema è facile trovarlo.
    La cosa importante è che le due tabelle abbiano lo stesso modello (ovvero, trattino gli stessi tipi di dato), così almeno è più facile lavorare.

    A tal proposito, il TableModel dovrebbe essere una istanza di una TUA classe, che modella i dati, in modo da poter trattare il dato nella sua interezza. In questa classe, figlia di AbstractTableModel, prevederei l'uso di un ArrayList<TuoOggetto> per mantenere lo stato della tabella e almeno tre metodi aggiuntivi molto utili: removeAll() che chiama un clear() del ArrayList, un getRow(int row) che restituisce l'oggetto alla posizione "row" del ArrayList e un addRow(TuoOggetto) che aggiungo il tuo oggetto all'ArrayList.

    Una soluzione potrebbe essere questa:

    1. Svuoto la seconda tabella.
    2. Scorro tutta la prima tabella e cerco le righe che nel particolare campo (l'undicesimo, stando al tuo codice) hanno il valore corretto.
    3. Trovata una riga, estraggo dal TableModel l'oggetto relativo a quella riga.
    4. Prendo questo oggetto e lo aggiungo al TableModel della seconda tabella.


    Tradotto in "pseudo-codice" e supponendo di usare un DefaultTableModel

    codice:
    TuoTableModel model1 = (TuoTableModel) main.getJTable().getModel();
    TuoTableModel model2 = (TuoTableModel) this.getTable().getModel();
    
    int numRowsT1 = main.getJTable().getRowCount();
    int numRowsT2 = this.getTable().getRowCount();
    
    // Punto 1: Svuoto il table-model della seconda tabella
    model2.removeAll();
    
    // Punto 2: scorro la prima tabella e cerco le righe interessate
    for(int i=0; i<numRowsT1; i++) {
       if ("testoDaCercare".equals((String) model1.getValueAt(i, 10))) {
          // Ho trovato una riga da portare nella seconda tabella
          // Punto 3: estraggo l'oggetto
          TuoOggetto to = model1.getRow( i );
    
          // Punto 4: aggiungo questo oggetto al modello della seconda tabella
          model2.addRow( to );
       }
    }
    Tutta la "fatica" sta nell'implementare correttamente il TableModel, ed in particolare i metodi che vanno ad aggiungere/rimuovere righe, più i metodi getColumnClass(int col) e getValueAt(int row, int col).


    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

  4. #4

    Soluzione trovata!

    Grazie prima di tutto per le risposte, sempre cortesi e di altissimo livello.

    Di seguito la soluzione che alla fine ho adottato:

    codice:
    //Copio i dati da tabella frame1 alla  tabella del frame 2
     
     public void writeTable() {
    
            int B = 9;
    
            for (int row = 0; row <= main.getJTable().getRowCount() - 1; row++) {
                for (int col = 0; col <= main.getJTable().getColumnCount(); col++) {
                    if (main.getJTable().getValueAt(row, 0) != null) {
                        index = row;
                    }
    
                    String campo1 = (String) main.getJTable().getValueAt(index, 0);
                    String campo2 = (String) main.getJTable().getValueAt(index, 1);
                    String campo3 = (String) main.getJTable().getValueAt(index, 2);
                    ecc.
                    ecc
                    table.setValueAt(campo1, index, 0);
                    table.setValueAt(campo2, index, 1);
                    table.setValueAt(campo3, index, 2);
                    ecc.
            ecc ..
    
                    }
                }
    
            }
        }
    //Dopdiché applico i filtri a piacimento sulla tabella 2 creando un metodo che richiamo alla pressione //di un pulsante seguente modo:
    
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { 
    
          // A e B sono le stringhe catturate da due comboBox
    
            TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(table.getModel());
            table.setRowSorter(sorter);
    
            RowFilter<TableModel, Object> firstFilter = null;
            RowFilter<TableModel, Object> secondFilter = null;
    
           
            List<RowFilter<TableModel, Object>> filters = new ArrayList<RowFilter<TableModel, Object>>();
            RowFilter<TableModel, Object> compoundRowFilter = null;
    
    
            try {
    
    
                firstFilter = RowFilter.regexFilter(A, 0);
                secondFilter = RowFilter.regexFilter(B, 1);
    
                filters.add(firstFilter);
                filters.add(secondFilter);
    
                compoundRowFilter = RowFilter.andFilter(filters); 
            } catch (java.util.regex.PatternSyntaxException e) {
                return;
            }
            sorter.setRowFilter(compoundRowFilter);
    
        }
    Quindi per riassumere ho prima copiato l'intera tabelle e poi ho applicato i filtri a seconda della stringa selezionata.
    Secondo te la soluzione adottata, può essere considerata una buona soluzione?

    Auguri per il nuovo anno e grazie ancora per tutto.

Tag per questa discussione

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.