Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    Scroll Automatico di Una JTable

    Salve a tutti .. dopo che su una JtextArea sono riuscito ( grazie a andbin ) a effettuare l'auto scoll all 'ultimo campo inserito e sto cercando di capirci come fare lo stesso sulla JTable ma niente da fare sono un po acerbo sulla gestione degli swing e mi faccio veramente del male.

    ecco il mio problema , mi sono fatto una Jtable personalizzata con il modello e il render e ad essa ho associato una JScrollPanel e fin qui tutto bene , quando riempo la Jtable oltre la finestra visualizzabile mi appare lo scroll.
    ma anche se ho provato a fare scorrere la tabella sempre all'ultimo campo non ci sono riuscito e sono rimasto fissato in alto , mentre io ho bisogno che mi resti a video sempre l'ultimo oggetto inserito.

    Qualcuno mi può spiegare come fare ?

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

    Re: Scroll Automatico di Una JTable

    Originariamente inviato da timeless
    Qualcuno mi può spiegare come fare ?
    Ma quel metodo scrollToBottom che avevo postato riceve un JScrollPane .... quindi dovrebbe funzionare qualunque cosa ci sia nel JScrollPane, JTextArea, JTable o altro che sia.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    il codice che mi hai dato nell'altro Post
    codice:
    textarea.setCaretPosition(textarea.getDocument().getLength());
    non riesco a integrarlo con una Jtable.

    ho sbaglio io o non so cosa fare ?
    non trovo setCaretPosition e nemmeno getDocument

    Attualmente l'ho scritta cosi ma ogni tanto mi si posiziona sul penultimo record e non sull'ultimo

    codice:
    jtable.scrollRectToVisible(jtable.getCellRect(jtable.getRowCount()+1,0,true));
    si può scrivere meglio ?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da timeless
    non riesco a integrarlo con una Jtable.
    Ma non c'è un "caret" e nemmeno un Document in un JTable ..... io parlavo del metodo scrollToBottom(JScrollPane scrollPane) che avevo postato, rintracciabile da un link nel post che ho linkato a te nell'altra discussione.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Ops. non mi ero accorto che cera un altro link mi ero fermato alla prima pagina perchè mi funzionava..

    Mi ero Fermato Qui

    Mentre te parlavi di Questo

    Allora ho provato il tuo codice
    codice:
        public static void scrollToBottom(JScrollPane scrollPane) {
            JScrollBar scrollBar = scrollPane.getVerticalScrollBar();
    
            int maximum = scrollBar.getMaximum();
            int visibleAmount = scrollBar.getVisibleAmount();
    
            scrollBar.setValue(maximum - visibleAmount);
        }
    Funziona ma mi si comporta come quello che avevo appena riscritto io

    codice:
    jtable.scrollRectToVisible(jtable.getCellRect(jtable.getRowCount() + 1, 0, true));
    Cioè alle volte mi si posiziona sulla penultima riga ..
    Ora mi è venuto il dubbio da dove lo lancio.

    cioè io popolo il modello e poi faccio un refresh della tabella
    subito dopo eseguo il Comando o la funzione per spostare lo scroll.

    cioè nel jFrame dove ho la Jtable faccio Questo
    codice:
    public void RefrehGui() {
            SwingUtilities.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    table.updateUI();
                    scrollToBottom(scrollPane);
                    //table.scrollRectToVisible(table.getCellRect(table.getRowCount() + 1, 0, true));
                }
            });
        }

  6. #6
    non ho capito bene da dove viene fuori il problema del posizionamento sul penultimo record che si presenta in entrambe le modalità di scroll.

    per ora ho risolto cosi

    codice:
     
    table.scrollRectToVisible(table.getCellRect(table.getRowCount() + 10, 0, true));
    Grazie Ancora .. a presto

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da timeless
    non ho capito bene da dove viene fuori il problema del posizionamento sul penultimo record che si presenta in entrambe le modalità di scroll.
    La questione, fine/subdola, è solo nel quando si fa lo scrolling rispetto a quando la riga viene fisicamente creata nella "view".

    Se fai in risposta ad un evento:
    // aggiungi riga nel model
    // scroll al fondo

    La riga esiste già nel model quando fai lo scroll ma non c'è ancora fisicamente in JTable. Solo quando il controllo ritornerà al framework allora verrà disegnata la nuova riga. Ma tu hai già fatto prima lo scroll .....

    Quindi la questione è solo: come "sapere" quando la riga è realmente inserita fisicamente nella tabella?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    infatti l'ho pensato anche io la cosa strana e che prima popolo il mio modello , poi lo passo alla jtabel , successivamente faccio il refrash della grafica e dopo eseguo la funzione per portare a video l'ultima riga ..

    probabilmente succede che il qualche funzione mi rallenta il popolamento del modello e quando viene caricata l'ultima riga ancora non ha caricato tutto il modello alla grafica ma non so dove mi succeda questa anomalia .

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da timeless
    infatti l'ho pensato anche io la cosa strana e che prima popolo il mio modello , poi lo passo alla jtabel , successivamente faccio il refrash della grafica e dopo eseguo la funzione per portare a video l'ultima riga ..
    Tutte queste cose che hai citato, le puoi indubbiamente fare in risposta all'evento (es. del pulsante). Ma che tu faccia qualunque add/insert sul modello o qualunque repaint() (che tra l'altro non serve .... già JTable "sa", notificato dal model, dove/come ridisegnarsi) non causano immediatamente nulla a video. Solo finito questo evento e ritornato il controllo al framework allora esso si accorgerà "ah c'è la tabella da ridisegnare" e quindi poi JTable si ridisegnerà dove necessario per mostrare la nuova riga.

    Quello che potrebbe essere interessante è che dopo una add sul model, il "preferred size" della tabella rispecchia già la nuova dimensione comprensiva della nuova riga. E quindi si potrebbe sfruttare questa informazione per chiedere che venga mostrato il punto più basso possibile basandosi su questa nuova altezza.

    Un'altra soluzione è registrare sul JTable un ComponentListener, che ha il componentResized(). Questo indica quando è già stato ridimensionato. Quindi in questo evento si può tranquillamente richiedere lo scroll al fondo. Unico punto negativo: vale per qualunque ridimensionamento, anche se es. si allargano le colonne della tabella, quindi andrebbe fatto un "filtro" per verificare se solo l'altezza è cambiata.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    repaint() serve perché sto utilizzando substance per cambiare lo stile delle finestre.

    le soluzioni da te citate sono interessanti entrambe ora devo capire quale è più elegante e come applicarla..

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.