Domanda

Ho incorporato un JTextArea su un JScrollPane e sto usando quel JTextArea per l'output.

Voglio che ogni volta che l'uscita superi le dimensioni di JTextArea, JTextArea scorre automaticamente in modo che l'utente non debba eseguire manualmente lo scorrimento verso il basso per vedere l'output recente.

Come posso farlo?

Ho già impostato la proprietà autoscroll di JTextArea e JScrollPane su true.

È stato utile?

Soluzione

Quando si utilizza JDK1.4.2 (o precedente) il suggerimento più comune che troverai nei forum è di usare il codice come il seguente:

textArea.append(...);
textArea.setCaretPosition(textArea.getDocument().getLength());

Tuttavia, ho appena notato che in JDK5 questo problema è stato effettivamente risolto da una modifica dell'API. È ora possibile controllare questo comportamento impostando una proprietà sul DefaultCaret dell'area di testo. Usando questo approccio il codice sarebbe:

JTextArea textArea = new JTextArea();
DefaultCaret caret = (DefaultCaret)textArea.getCaret();
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);

Nota:

Il suggerimento sopra riportato per impostare il criterio di aggiornamento del cursore non funziona.

Invece potresti voler dare un'occhiata a Smart Scrolling che offre all'utente la possibilità di determinare quando lo scorrimento deve essere automatico o meno.

Una descrizione più dettagliata dello scorrimento automatico in un'area di testo è disponibile qui: Scorrimento area di testo

Altri suggerimenti

    JScrollBar vbar = scrollPane.getVerticalScrollBar();

    for (int i = 0; i < 20; i++) {

        myJTxt.append("This is text " + i + "\n");
        vbar.setValue(vbar.getMaximum());
        vbar.paint(vbar.getGraphics());
        myJTxt.scrollRectToVisible(myJTxt.getVisibleRect());
        myJTxt.paint(myJTxt.getGraphics());
        try {
            Thread.sleep(250);
        } catch (InterruptedException ex) {
            Logger.getLogger(ScrollTextView.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

Quando si fa clic in un punto qualsiasi su JTextArea, è possibile interrompere lo scorrimento automatico. Poiché una volta cambiata la posizione del cursore, anche il punto di vista è cambiato. In questo momento dovresti impostare la posizione del cursore quando aggiungi o aggiungi del testo. Sulla mia strada, ho creato un metodo che includeva la posizione di inserimento, quindi lo uso quando si desidera aggiungere o aggiungere qualcosa.

    JTextArea jTextArea = new JTextArea();
    DefaultCaret caret = (DefaultCaret)jTextArea.getCaret();
    caret.setUpdatePolicy(DefaultCaret.OUT_BOTTOM);

Ho provato la maggior parte dei suggerimenti ma ho riscontrato problemi quando il contenuto di JTextArea diventa grande (diversi MB). Infine, i seguenti risultati hanno mostrato le migliori prestazioni:

myTextArea.append( someText );
myTextArea.getCaret().setDot( Integer.MAX_VALUE );

Ovviamente, qualsiasi selezione effettuata dall'utente viene persa. Quindi, è utilizzabile solo per un "solo display". utilizzo dell'area di testo.

Tuttavia, nella mia installazione, se il contenuto di JTextArea supera i 9 MB, diventa in qualche modo inutilizzabile (dalla GUI molto lenta a quasi congelata).

Un fenomeno simile si verifica quando il testo contiene caratteri rappresentati da due caratteri (due unità a 16 bit) nella codifica UTF-16 (le cosiddette coppie surrogate, come questa: ??). Ho una soluzione per il filtro, ma forse un argomento diverso.

Usa questo invece

JTextArea textArea = new JTextArea();
DefaultCaret caret = (DefaultCaret)textArea.getCaret();
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
scrollPane = new JScrollPane();
scrollPane.add(textArea);
scrollPane.setViewportView(textArea);

Prova questo:

JTextArea jTextArea = new JTextArea();
JScrollPane jScrollPane = new JScrollPane();
jScrollPane.setViewport(jTextArea);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top