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:
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:
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...
you should have read through should avoid use of set(preferred|maximum|minimum)size methods in java swing?
Comments
Post a Comment