java - How do I dynamically create multiple swing objects and remove them one at a time? -
i'd create new jpanel each click of button , have objects on panel created (buttons and/or labels). part seems technically working, run problems when trying remove panels (from last added first) 1 @ time.
i've tried trim down code as possible, though left in unused array because think that's how i'm suppose make work. advice appreciated. let me know if vague, trying verbalize question harder thought.
disclaimer: @ least few best practices have been ignored, sorry.
public class createpanelstest{ jpanel totalgui; gridlayout grid = new gridlayout(0,1); int panelx = 10; public jpanel createcontentpane (){ //create bottom jpanel place on. totalgui = new jpanel(); //set layout manager null, manually place objects totalgui.setlayout(null); jpanel controlpanel = new jpanel(); controlpanel.setlocation(50, 220); controlpanel.setsize(200, 40); jbutton addset = new jbutton("add set"); addset.addactionlistener(new java.awt.event.actionlistener() { @override public void actionperformed(java.awt.event.actionevent evt) { newsetactionperformed(evt); } }); jbutton removeset = new jbutton("remove set"); removeset.addactionlistener(new java.awt.event.actionlistener() { @override public void actionperformed(java.awt.event.actionevent evt) { removesetactionperformed(evt); } }); controlpanel.add(addset); controlpanel.add(removeset); totalgui.add(controlpanel); totalgui.revalidate(); return totalgui; } private void newsetactionperformed(java.awt.event.actionevent evt) { //on button click adds group jpanel newpanel = new jpanel(grid); newpanel.setlocation(panelx, 10); newpanel.setsize(50,200); jbutton button1 = new jbutton("1"); jbutton button2 = new jbutton("2"); newpanel.add(button1); newpanel.add(button2); totalgui.add(newpanel); totalgui.validate(); totalgui.repaint(); panelx = panelx+50; } private void removesetactionperformed(java.awt.event.actionevent evt) { //this suppose remove 1 panel @ time //totalgui.remove(newpanel); //totalgui.validate(); //totalgui.repaint(); //panelx = panelx-50; } public jpanel[] autoarray(){ //was hoping make method work me, unused atm int n = 6; //can change value of "n" later or break stuff? jpanel[] panels = new jpanel[n]; (int = 0; i<n; i++){ panels[i] = new jpanel(grid); } return panels; }
- don't use null layout. bite in tail.
- if goal remove the last component added, can find getting components held container calling
getcomponents()
. return array of components. remove last item in array,revalidate()
,repaint()
container.
edit
example:
import java.awt.*; import java.awt.event.actionevent; import javax.swing.*; @suppresswarnings("serial") public class createpanelstest2 { protected static final int pref_w = 600; protected static final int pref_h = 450; jpanel mainpanel = new jpanel() { @override public dimension getpreferredsize() { return new dimension(pref_w, pref_h); } }; jpanel panelholderpanel = new jpanel(new gridlayout(1, 0)); public createpanelstest2() { jpanel btnpanel = new jpanel(new gridlayout(1, 0, 5, 0)); btnpanel.add(new jbutton(new addaction())); btnpanel.add(new jbutton(new removeaction())); jpanel borderlayoutpanel = new jpanel(new borderlayout()); borderlayoutpanel.add(panelholderpanel, borderlayout.west); jscrollpane scrollpane = new jscrollpane(borderlayoutpanel); scrollpane.sethorizontalscrollbarpolicy(jscrollpane.horizontal_scrollbar_always); mainpanel.setborder(borderfactory.createemptyborder(5, 5, 5, 5)); mainpanel.setlayout(new borderlayout()); mainpanel.add(scrollpane, borderlayout.center); mainpanel.add(btnpanel, borderlayout.south); } public jcomponent getmaincomponent() { return mainpanel; } private class addaction extends abstractaction { int counter = 0; public addaction() { super("add"); } @override public void actionperformed(actionevent evt) { counter++; jpanel innerpanel = new jpanel(new gridlayout(0, 1)); innerpanel.add(new jbutton("foo " + counter)); innerpanel.add(new jbutton("bar " + counter)); panelholderpanel.add(innerpanel); mainpanel.revalidate(); mainpanel.repaint(); } } private class removeaction extends abstractaction { public removeaction() { super("remove"); } @override public void actionperformed(actionevent arg0) { component[] comps = panelholderpanel.getcomponents(); if (comps.length > 0) { panelholderpanel.remove(comps[comps.length - 1]); mainpanel.revalidate(); mainpanel.repaint(); } } } private static void createandshowgui() { createpanelstest2 test2 = new createpanelstest2(); jframe frame = new jframe("createpanelstest2"); frame.setdefaultcloseoperation(jframe.exit_on_close); frame.getcontentpane().add(test2.getmaincomponent()); frame.pack(); frame.setlocationrelativeto(null); frame.setvisible(true); } public static void main(string[] args) { swingutilities.invokelater(new runnable() { public void run() { createandshowgui(); } }); } }
Comments
Post a Comment