Avatar billede swami Nybegynder
19. marts 2004 - 12:27 Der er 10 kommentarer og
1 løsning

Automatic JTextArea scrolling

Hey,

I have a JTextArea within a JScrollPane which gets updated/appended with text when you press enter. However, the scrollbar won't scroll down automatically. It works fine after you've dragged the mouse in the text area once.

I want the scroller to begin scrolling automatically without having to manually scroll first! I've tried various repaint() and revalidate() and setPreferredSize() and requestFocus() and setValue() methods but neither works the way I want it to.

Any ideas?
Thanks.
Avatar billede mikkelbm Nybegynder
19. marts 2004 - 12:39 #1
Try this:

Document doc = yourTextArea.getDocument();
yourTextArea.select(doc.getLength(), doc.getLength());
Avatar billede _carsten Nybegynder
19. marts 2004 - 12:50 #2
You are doing something wrong, which I can't figure out, by default a JTextArea automatically scrolls.

Test this one

public class Test1 extends javax.swing.JFrame {
    public Test1() {
        initComponents();
        jTextArea1.setLineWrap(true);
        setSize(600,250);
    }

    private void initComponents() {
        jTextField1 = new javax.swing.JTextField();
        jScrollPane1 = new javax.swing.JScrollPane();
        jTextArea1 = new javax.swing.JTextArea();

        getContentPane().setLayout(new java.awt.FlowLayout());

        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });

        jTextField1.setPreferredSize(new java.awt.Dimension(200, 20));
        jTextField1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                addText(evt);
            }
        });

        getContentPane().add(jTextField1);

        jTextArea1.setColumns(50);
        jTextArea1.setRows(10);
        jScrollPane1.setViewportView(jTextArea1);

        getContentPane().add(jScrollPane1);

        pack();
    }

    private void addText(java.awt.event.ActionEvent evt) {
        jTextArea1.append(jTextField1.getText() + "\n");
    }
   
    private void exitForm(java.awt.event.WindowEvent evt) {
        System.exit(0);
    }

    public static void main(String args[]) {
        new Test1().show();
    }
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTextArea jTextArea1;
    private javax.swing.JTextField jTextField1; 
}
Avatar billede mikkelbm Nybegynder
19. marts 2004 - 12:59 #3
>> Carsten

Man kan komme ud for at den ikke automatisk scroller ned. Jeg ved ikke om det har noget med fokus at gøre (hvis man evt. har flere textarea's).

Jeg har oplevet det engang, og løste problemet med det jeg skrev i mit første indlæg!
Avatar billede _carsten Nybegynder
19. marts 2004 - 13:14 #4
Jeg skulle lige til at protestere, men har lige siddet og leget lidt med det, og du har ret, hvis klikker med musen i JTextArea'et og flytter tilbage til sit TextField, så scroller den faktisk ikke til nederste linie
Avatar billede _carsten Nybegynder
19. marts 2004 - 13:17 #5
Det må have noget at gøre med, at man sætter caret position, når man klikker i textarea'et ville jeg mene og den forbliver så der
Avatar billede mikkelbm Nybegynder
19. marts 2004 - 13:17 #6
Nemlig. Hvor "fejlen" ligger ved jeg ikke. Men det er underligt.
Avatar billede swami Nybegynder
19. marts 2004 - 13:26 #7
Tack för svaren, jag provade att applicera carstens kod utan framgång.. Mystiskt!
Avatar billede _carsten Nybegynder
19. marts 2004 - 13:37 #8
Well - mikkelbm and I figured out, that you should try to implement mikkelbm's code, it should work well.

The problem obviously occur if you click in the JTextArea and then back to
JTextField, caret position vill be set (I believe) and it stays there
Avatar billede _carsten Nybegynder
19. marts 2004 - 16:28 #9
I don't know if you made it work, otherwise you can replace my addText() method with this one

    private void addText(java.awt.event.ActionEvent evt) {
        jTextArea1.append(jTextField1.getText() + "\n");
       
        JScrollBar bar = jScrollPane1.getVerticalScrollBar();
        bar.setValue(jTextArea1.getHeight());
    }

It will do the trick.
Avatar billede swami Nybegynder
20. marts 2004 - 11:52 #10
Well what do you know, it works like a charm now! Thanks for the help guys.
Avatar billede _carsten Nybegynder
20. marts 2004 - 12:57 #11
Glad that we could help, you now only have one thing to do, which is to close this question. That is done by accepting one or more af the answers provided to this question an give points to the person/persons who provided you with code that solved your problem.
Here you have 3 possibilityes (because you answered it your self), which is to accept your own, mikkelbm's or my answer and thereby provide the person/persons with points
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester