Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    132

    jTable inserimento righe e scroll

    Ciao a tutti,
    Ho una tabella che contiene una lista in ordine alfabetico (tranne le prime 3 colonne dove si possono inserire valori).
    Aggiungo una riga scelta da combo e la inserisco nella tabella ( aggRiga() ).
    In efetti aggiungo la riga in coda all'array che popola la tabella, lo riordino, e richiamo la tabella
    ( tabella t = new tabella(); t.Tabella(); ).
    Tutto funziona bene, tranne un fastidioso inconveniente, quando chiamo la tabella la barra di scorrimento laterale torna al top.
    Mi piacerebbe che la tabella rimanesse dove era (inteso come scroll verticale) al memento dell'inserimento riga.
    Suppongo che dovrei evitare di inizializzare la tabella dopo l'inserimento, ma non so come aggiornarla altrimenti.

    Qualcuno ha un'idea ?

    Grazie.


    codice:
    //    TODO class tabella {
    
    public  class tabella {
    
    //<<<<<<<  dati()
    public void dati(String[] colonne,String[][] dati) {
    .........  popolo arraiDatiTabella
    
    }
    
    
    //<<<<<<<  aggRiga()
    public void aggRiga(){
    
        for (int a = 0; a < arraiDatiTabella.length; a++)  {
        if (arraiDatiTabella[a][3] == null) {
            numListino3=a;
            break;
        } }
       
          selCodifica = comboCodifica.getSelectedIndex();    
    
        for (int ar = 0; ar < 14; ar++) {
            arraiDatiTabella[numListino3][ar]=arraiDatiCodifica[selCodifica][ar];
        }
            for (int ar1 = 0; ar1 < arraiIntListino.length; ar1++) {
            arraiDatiListino[numListino3][ar1]=arraiDatiCodifica[selCodifica][ar1];
        }
    
    ordina(arraiColTabella,arraiDatiTabella);  // metodo per ordinare alfabeticamente
    
    }
    
    //<<<<<<<  CancRiga()
    public void CancRiga() {
    
    ........ simile ad aggRiga()
    
    }
    
    
    //<<<<<<<   tabella--------------------------------
    public void Tabella() {
    
            final JTable TableListino = new JTable(new MyTableModel());
            TableListino.setCellSelectionEnabled(true);
         
            if (tabScroll==true) {
           TableListino.setAutoResizeMode (JTable.AUTO_RESIZE_ALL_COLUMNS);
    
        }
            if (tabScroll==false) {
             TableListino.setAutoResizeMode (JTable.AUTO_RESIZE_OFF);
    
        }
    
          TableListino.getColumnModel().getColumn(0).setCellRenderer(new myRender1());
          TableListino.getColumnModel().getColumn(0).setPreferredWidth(col1Larg);
          TableListino.getColumnModel().getColumn(1).setCellRenderer(new myRender1());
          TableListino.getColumnModel().getColumn(1).setPreferredWidth(50);
          TableListino.getColumnModel().getColumn(2).setCellRenderer(new myRender1());
          TableListino.getColumnModel().getColumn(2).setPreferredWidth(50);     
    
    // evita che si attacchi vecchio testo al nuovo
    TableListino.addKeyListener(new KeyAdapter() {
            @Override
        public void keyPressed(KeyEvent e) {
            int col3 = TableListino.getSelectedColumn();
            int row3= TableListino.getSelectedRow();
            int keyCode = e.getKeyCode();
            if(keyCode!=40){
            if(keyCode!=38){
            if(keyCode!=39){
            if(keyCode!=37){
            if(keyCode!=10){
            TableListino.setValueAt("", row3, col3);
            }}}}}
        }
        });
    
    TableListino.addMouseListener(new MouseAdapter() {
                    @Override
            public void mousePressed(MouseEvent e) {
            rigaNum= TableListino.getSelectedRow();
            }
            });
    
      TableListino.getModel().addTableModelListener(new TableModelListener() {
            public void tableChanged(TableModelEvent e) {
    
             colonna = TableListino.getSelectedColumn();
            row = TableListino.getSelectedRow();
            String aa = TableListino.getModel().getValueAt(row, colonna).toString();    
    
                }    
                
           } });
    
    jScrollPane1.getViewport().add(TableListino);
    
    }
    }
    
    
    //<<<<<<<  MyTableModel
    class MyTableModel extends AbstractTableModel {
    
        //   inserisce i dati in tabella
       private String[] colonne = arraiColTabella;
       private Object[][] righe = arraiDatiTabella;
    
        public int getColumnCount() {
               return colonne.length;
               }
    
        public int getRowCount() {
              return righe.length;
              }
    
                @Override
        public String getColumnName(int col) {
              return colonne[col];
              }
    
        public Object getValueAt(int col,int row) {
    
            return righe[col][row];
             }
    
        public void setData(String[][] newdata) {
              righe = newdata;
              fireTableDataChanged();
              }
    
        public boolean isCellSelected(int row,int column) {
            if (column > 2) {
            return false;
            } else {
            return true;
            }
            }
    
                @Override
        public boolean isCellEditable(int col,int row) {
            if (row > 2) {
            return false;
            } else {
            return true;
            }
    
            }
    
          public boolean isCellSelectable(int row,int column) {
            if (column > 2) {
            return false;
            } else {
            return true;
            }
    
            }
    
                @Override
    public void setValueAt(Object value, int col,int row) {
    
    // gestisce inserimento valori in tabella ( solo numeri positivi nelle prime 3 colonne)
    
    boolean no=false;
    boolean numerico=false;
    String aa=value.toString();
    String aa1=value.toString();
    double numero =0;
    double numeroV =0;
    
    // formato numero
    if ( !aa.equals("")) {
    if ( controlloIntString(aa)==true) {
    //    System.out.println("formato numero");
    numero =Double.parseDouble(aa);
    if ( !arraiDatiListino[col][row].equals("")) {
    numeroV =Double.parseDouble(arraiDatiListino[col][row]);
       }
    arrotonda1(numero, 2);
            DecimalFormat df = new DecimalFormat("0.00");
            String output = df.format(numero);
    
         for(int i=0; i<output.length(); i++){
            char car = output.charAt(i);
            if(car==',')
            {
            output = output.substring(0,i) + '.'+ output.substring(i+1);
            }
            }
    
    
            aa1=String.valueOf(output);
    numerico=true;
            }}
    
    // controllo numero
    if ( !aa.equals("")) {
        if ( numerico==false) {
            righe[col][row]= arraiDatiListino[col][row];
            no=true;
            }}
    
    // controllo segno
    if ( !aa.equals("")) {
    if ( numero<0) {
            righe[col][row]= arraiDatiListino[col][row];
            no=true;
            }}
    
    // controllo colonne
    if (no==false) {
    if (row < 3) {
         righe[col][row]= value;
                }}
    
    // controllo colonne scrivi num format
    if ( !aa.equals("")) {
    if (no==false) {
    if (row < 3) {
            righe[col][row]= aa1;
                }}}
    
    // diff prezzo
    if ( !aa.equals("")) {
    if (no==false) {
    if ( !arraiDatiListino[col][row].equals("")) {
    if (row == 1) {
       double dif = numeroV-numero;
       arrotonda1(dif, 2);
        DecimalFormat df = new DecimalFormat("0.00");
            String output = df.format(dif);
       String diff=String.valueOf(output);
    }}}}
    
            fireTableCellUpdated(col,row);        
            if (DEBUG) {
                printDebugData();
            }
            }
    
        private void printDebugData() {
            int numRows = getRowCount();
            int numCols = getColumnCount();
            for (int i=0; i < numRows; i++) {
            for (int j=0; j < numCols; j++) {
            }
            }
            }
    }
    
    //<<<<<<<  myRender (non usato)
    class myRender extends DefaultTableCellRenderer {
    public Component getTableCellRendererComponent
            (JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    
            Component cell = super.getTableCellRendererComponent
                (table, value, isSelected, hasFocus, row, column);
            Font ArialFont = new Font("Arial", Font.PLAIN, 20);
            Font  CourierFont = new Font("Courier", Font.PLAIN, 15);
    
    //....... etc.

  2. #2
    Prova con setAutoscrolls().
    lolide
    Java Programmer

    Informati

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: jTable inserimento righe e scroll

    Originariamente inviato da andreu
    Tutto funziona bene, tranne un fastidioso inconveniente, quando chiamo la tabella la barra di scorrimento laterale torna al top.

    codice:
    public void Tabella() {
    
            final JTable TableListino = new JTable(new MyTableModel());
    Se ho ben capito, tu hai una struttura dati esterna al tuo MyTableModel (che poi la referenzia) e per aggiungere una riga: 1) aggiorni questa struttura dati, 2) istanzi un nuovo oggetto MyTableModel (che usa quella struttura dati esterna) e 3) istanzi un nuovo JTable.

    E questo in sostanza vuol dire che essendo tutto nuovo, è chiaro che la tabella riprende la "vista" predefinita al top. L'approccio comunque è fumoso e poco appropriato. Devi ragionare sul table model, fare in modo che sia il table model stesso (tramite metodi custom che metti tu) ad aggiungere la riga andando a modificare la sua struttura dati che dovrebbe restare interna e poi a fare il "fire" dell'evento in modo che la "view" di JTable si riaggiorni (e in tal modo manterrebbe la locazione di scroll!).

    Se ne è parlato già in passato sul forum, fai magari una ricerca. Comunque come hai fatto adesso, beh, non vai molto "lontato" con questo approccio.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    132

    bè, faccio quello che posso : )

    Grazie a tutti per l'aiuto.
    Purtroppo il "setAutoscrolls()." non serve, mi inibisce solo lo scroll quando mi muovo con i tasti.
    Ha ragione andbin, ma c'è una cosa che non mi rimane chiara.
    Sono perfettamente d'accordo che sia la tabella che deve accorgersi dei mutamenti dell'array, ma essendo estrerni sia il combo dal quale estraggo la linea da inserire, sia il bottone "aggiungi riga", ho bisogno di un listener nella tabella su ciò che accade fuori. Tutti quelli che ho gestito fino ad ora si riferivano ad eventi interni alla tabella.
    Credo la soluzione migliore sia un listener sui mutamenti dell'array, ma non riesco a scriverlo.

    Grazie

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: bè, faccio quello che posso : )

    Originariamente inviato da andreu
    Credo la soluzione migliore sia un listener sui mutamenti dell'array, ma non riesco a scriverlo.
    No, ripeto che è il table model che dovrebbe "offrire" un metodo (chiamalo come vuoi, es. aggiungiRiga() magari che riceve già dei dati) che aggiorna la struttura dati (che dovrebbe restare, in linea di massima e per questioni di design, interna al model) e poi fare un "fire" dell'evento, vedi i vari fireXXX che sono "ereditati" da AbstractTableModel.
    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
    Nov 2010
    Messaggi
    132

    era facile

    Grazie ancora, mi sa che il tableModel devo capirlo meglio.
    Ho provato ad aggiungere e chiamare da pulsante :

    codice:
    public void refresh() {
              fireTableDataChanged();
              }
    Ma la nuova riga compare solo quando, con lo scroll faccio scomparire, e ricomparire quella porzione di schermo.

    Invece semplicemente spostando :
    "final JTable TableListino = new JTable(new MyTableModel());"
    fuori dal metodo "tabella", quando lo chiamo non la ricrea nuova : )

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 © 2026 vBulletin Solutions, Inc. All rights reserved.