swing - java JPanel, dynamically adding components to it and JScrollPane -


we've been experimenting around without luck, please note i'm using components wrong way... we've got jframe cointaining jpanel, contains jscrollpane jpanel inside of it, called interiorpanel. having jbutton action adds components dynamically innermost panel , calls revalidate() method, interiorpanel grows need inside of jscrollpane, showing scroll bars this:

the desired case

however, want add components loop instead of using button. using loop:

for (int = 1; < 10; i++) {     demo.getpanelinterior().add(new jbutton("hello"));     demo.getpanelinterior().revalidate();     demo.getpanelinterior().repaint(); } 

doesn't seem work in case when click button since innermost panel grows, scroll bars don't show up, end this:

undesired effect

what should result first image? here's working example code:

    import java.awt.*;     import java.awt.event.*;      import javax.swing.*;       public class demo extends jpanel {          private jpanel exteriorpanel;         private jpanel interiorpanel;         private jbutton button;         private jlist<string> list;         private string[] imagenames = { "bird", "cat", "dog", "rabbit", "pig", "dukewavered",         "kathycosmo", "lainestongue", "left", "middle", "right", "stickerface"};         private defaultlistmodel<string> model;            public demo() {              //create list of images , put in scroll pane.              model = new defaultlistmodel<>();             (string s : imagenames) {                 model.addelement(s);             }              list = new jlist<string>(model);             list.setselectionmode(listselectionmodel.single_selection);             list.setselectedindex(0);              jscrollpane listscrollpane = new jscrollpane();             listscrollpane.setviewportview(list);              button = new jbutton("add element");             button.addactionlistener(new actionlistener() {                  @override                 public void actionperformed(actionevent e) {                     buttonactionperformed(e);                 }             });          interiorpanel = new jpanel();         interiorpanel.add(listscrollpane);         interiorpanel.add(button);         interiorpanel.setlayout(new flowlayout(flowlayout.left, 2, 2));          jscrollpane anotherscroll = new jscrollpane();         anotherscroll.setviewportview(interiorpanel);          exteriorpanel = new jpanel();         exteriorpanel.add(anotherscroll);         exteriorpanel.setpreferredsize(new dimension(400, 200));          interiorpanel.setbackground(new color(255, 0, 0));       }      private void buttonactionperformed(actionevent e) {         model.addelement("hola");         interiorpanel.add(new jbutton("hello"));         interiorpanel.revalidate();     }      //used splitpanedemo2     public jlist getimagelist() {         return list;     }      /**      * create gui , show it.  thread safety,      * method should invoked      * event-dispatching thread.      */     private static void createandshowgui() {          //create , set window.         jframe frame = new jframe("demo");         frame.setdefaultcloseoperation(jframe.exit_on_close);         demo demo = new demo();         frame.getcontentpane().add(demo.getexteriorpanel());          //display window.         frame.pack();         frame.setvisible(true);          (int = 1; < 10; i++) {             demo.getpanelinterior().add(new jbutton("hello"));             demo.getpanelinterior().revalidate();             demo.getpanelinterior().repaint();         }       }      public jpanel getexteriorpanel() {         return exteriorpanel;     }      public jpanel getpanelinterior() {         return interiorpanel;     }      public static void main(string[] args) {         //schedule job event-dispatching thread:         //creating , showing application's gui.         javax.swing.swingutilities.invokelater(new runnable() {             public void run() {                 createandshowgui();             }         });     }   } 

thanks in advance

the (main) problem exteriorpanel's use of flowlayout, allowing expand meet requirements of jscrollpane, try , use preferred size of it's contents base it's own layout calculations...this compounding produce result seeing. in fact, when using "click button", happen if try resizing window...

instead, try changing layout manager of exteriorpanel, example...

exteriorpanel = new jpanel(new borderlayout()); 

this force scrollpane meet requirements of parent container , allow view overflow bounds , display scrollbars...

using border layout

you should have read through should avoid use of set(preferred|maximum|minimum)size methods in java swing?


Comments

Popular posts from this blog

javascript - Jquery show_hide, what to add in order to make the page scroll to the bottom of the hidden field once button is clicked -

Error while updating a record in APEX screen -

python - How to get a widget position inside it's layout in Kivy? -