java - JScrollPane and autoscroll: Disturbing scrolling behavior -


i writing application uses jscrollpane. in jscrollpane want automatically display search results, means, have dynamically add , remove results within jscrollpane. results realised jtextarea, embeded within gridbaglayout.

when there high number of search results, jscrollpane automatically scrolls bottom (it should @ top). have solved solution found here. problem hereby is, can see, how scrolls top. possible remove behaviour?

the following things found out:

  • i have remove previous search results display new ones. if don't remove previous ones, displays correctly.
  • it neither solves prblem wgeb update jscrollpane every tune after adding arow nor when updating after adding rows.

the best disable autoscroll. have created executable example demonstrate behavior. when clicking button "add row", 500 rows added. when clicking several times, becomes clear.

thank help!

import java.awt.gridbagconstraints; import javax.swing.jtextarea;  public class scrollpanetest extends javax.swing.jframe {     private javax.swing.jbutton jbutton1;     private javax.swing.jpanel jpanel1;     private javax.swing.jpanel jpanel2;     private javax.swing.jscrollpane jscrollpane1;       /**      * creates new form scrollpanetest      */     public scrollpanetest() {         initcomponents();     }      /**      * adds new row.      * @param index index of new row.      */     private void addrow(int index) {         jtextarea row = new jtextarea("area " + index);         row.seteditable(false);         row.setborder(null);          gridbagconstraints gridbagconstraints = new gridbagconstraints();         gridbagconstraints.gridx = 0;         gridbagconstraints.gridy = index;         gridbagconstraints.fill = gridbagconstraints.both;         gridbagconstraints.weightx = 1.0;         gridbagconstraints.insets = new java.awt.insets(2, 0, 2, 0);         jpanel2.add(row, gridbagconstraints);     }       /**      * initializes components.      */     private void initcomponents() {          jscrollpane1 = new javax.swing.jscrollpane();         jpanel1 = new javax.swing.jpanel();         jpanel2 = new javax.swing.jpanel();         jbutton1 = new javax.swing.jbutton();          setdefaultcloseoperation(javax.swing.windowconstants.exit_on_close);          jscrollpane1.sethorizontalscrollbarpolicy(javax.swing.scrollpaneconstants.horizontal_scrollbar_never);         jscrollpane1.setverticalscrollbarpolicy(javax.swing.scrollpaneconstants.vertical_scrollbar_always);         jscrollpane1.setpreferredsize(new java.awt.dimension(400, 400));          jscrollpane1.setviewportview(jpanel1);          jpanel1.setlayout(new java.awt.borderlayout());          jpanel2.setlayout(new java.awt.gridbaglayout());         jpanel1.add(jpanel2, java.awt.borderlayout.north);          jscrollpane1.setviewportview(jpanel1);          jbutton1.settext("create rows");         jbutton1.addactionlistener(new java.awt.event.actionlistener() {             public void actionperformed(java.awt.event.actionevent evt) {                 jbutton1actionperformed(evt);             }         });          javax.swing.grouplayout layout = new javax.swing.grouplayout(getcontentpane());         getcontentpane().setlayout(layout);         layout.sethorizontalgroup(             layout.createparallelgroup(javax.swing.grouplayout.alignment.leading)             .addcomponent(jscrollpane1, javax.swing.grouplayout.default_size, javax.swing.grouplayout.default_size, short.max_value)             .addgroup(layout.createsequentialgroup()                 .addgap(148, 148, 148)                 .addcomponent(jbutton1)                 .addcontainergap(javax.swing.grouplayout.default_size, short.max_value))         );         layout.setverticalgroup(             layout.createparallelgroup(javax.swing.grouplayout.alignment.leading)             .addgroup(layout.createsequentialgroup()                 .addcomponent(jscrollpane1, javax.swing.grouplayout.preferred_size, 245, javax.swing.grouplayout.preferred_size)                 .addpreferredgap(javax.swing.layoutstyle.componentplacement.unrelated)                 .addcomponent(jbutton1)                 .addgap(0, 21, short.max_value))         );          pack();     }                         /**      * creates 500 new rows.      * @param evt      */     private void jbutton1actionperformed(java.awt.event.actionevent evt) {          jpanel2.removeall();          for(int = 0; < 1000; i++) {             addrow(i);         }           javax.swing.swingutilities.invokelater(new runnable() {             @override             public void run() {                 jscrollpane1.getverticalscrollbar().setvalue(0);             }           });          jpanel2.validate();          jpanel2.repaint();     }                                              public static void main(string args[]) {         java.awt.eventqueue.invokelater(new runnable() {             @override             public void run() {                  new scrollpanetest().setvisible(true);             }         });     }              } 

update 1

i removed lambda expressions. should compileable < java 8.

update 2

the problem disturbing scrolling behavior has been solved replacing

jpanel2.validate(); jpanel2.repaint(); 

with

jscrollpane1.validate(); jscrollpane1.repaint(); 

nevertheless, both answers question can helpful in other cases , should given attention.

one way achieve have custom jviewport scrollpane. custom viewport overrides setviewposition , uses flag prevent scroll, or not.

here example of such code, before changing content of textarea, "lock" viewport prevent scrolling, , unlock later:

import java.awt.point; import java.awt.event.actionevent; import java.awt.event.actionlistener;  import javax.swing.jframe; import javax.swing.jscrollpane; import javax.swing.jtextarea; import javax.swing.jviewport; import javax.swing.swingutilities; import javax.swing.timer;  public class testnoscrolling {      private int linecount = 0;     private lockableviewport viewport;     private jtextarea ta;      private final class lockableviewport extends jviewport {          private boolean locked = false;          @override         public void setviewposition(point p) {             if (locked) {                 return;             }             super.setviewposition(p);         }          public boolean islocked() {             return locked;         }          public void setlocked(boolean locked) {             this.locked = locked;         }     }      protected void initui() {         jframe frame = new jframe("test");         ta = new jtextarea(5, 30);         jscrollpane scrollpane = new jscrollpane();         viewport = new lockableviewport();         viewport.setview(ta);         scrollpane.setviewport(viewport);         frame.add(scrollpane);         frame.pack();         frame.setvisible(true);         timer t = new timer(1000, new actionlistener() {              @override             public void actionperformed(actionevent e) {                 viewport.setlocked(true);                 ta.append("some new line " + linecount++ + "\n");                 swingutilities.invokelater(new runnable() {                     @override                     public void run() {                         viewport.setlocked(false);                     }                 });             }         });         t.setrepeats(true);         t.start();     }      public static void main(string[] args) {         swingutilities.invokelater(new runnable() {              @override             public void run() {                 new testnoscrolling().initui();             }         });     } } 

Comments

Popular posts from this blog

node.js - Mongoose: Cast to ObjectId failed for value on newly created object after setting the value -

[C++][SFML 2.2] Strange Performance Issues - Moving Mouse Lowers CPU Usage -

ios - Possible to get UIButton sizeThatFits to work? -