java - How to dynamically remove a JPanel? -
i have a gui looks follow.
i want dynamically add/remove panel. use arraylist
keep trace of jpanel
objects. , add panel dynamically, when want delete panel, not attribute can not remove it.
here code:
public class main implements actionlistener{ private list <mypanel> mplist; private jpanel btnpanel; private jbutton jbtadd,jbtdelete; private jframe jf; private jpanel jp; private jscrollpane js; private mypanel mp; private static int size=0; private int selectedid=-1; //private public main(){ mplist=new arraylist<mypanel>(); btnpanel=new jpanel(); jbtadd=new jbutton("addjpanel"); jbtdelete=new jbutton("deljpanel"); btnpanel.setlayout(new flowlayout(flowlayout.left,1,1)); btnpanel.add(jbtadd); btnpanel.add(jbtdelete); jf=new jframe("hello"); jp=new jpanel(); js=new jscrollpane(jscrollpane.vertical_scrollbar_as_needed, jscrollpane.horizontal_scrollbar_as_needed); //jp.setlayout(new flowlayout(flowlayout.left,1,1)); jf.setlayout(new borderlayout(10,10)); jp.setlayout(new gridlayout(0,1,1,1)); jp.setpreferredsize(new dimension(500, 82*6)); for(int i=0;i<6;i++){ mypanel mp=new mypanel(); //mp.setsize(400, 82); //mp.setbounds(0,82*i,480,82); mp.getfiletypeiconlabel().settext(string.valueof(i)); mp.setindexid(size); size++; mplist.add(0,mp); mp.addmouselistener(new mouselistener(){ @override public void mouseclicked(mouseevent e) { // todo auto-generated method stub if(2==e.getclickcount()){ system.out.println("indexind is"+mplist.get(0).getindexid()); //system.out.println(index); mplist.get(0).setbackground(color.yellow); } } @override public void mouseentered(mouseevent e) { // todo auto-generated method stub } @override public void mouseexited(mouseevent e) { // todo auto-generated method stub } @override public void mousepressed(mouseevent e) { // todo auto-generated method stub } @override public void mousereleased(mouseevent e) { // todo auto-generated method stub }}); jp.add(mplist.get(0)); } js.setviewportview(jp); jf.setsize(600, 500); jf.add(btnpanel,borderlayout.north); jf.add(js); jbtadd.addactionlistener(this); jbtdelete.addactionlistener(this); jf.setvisible(true); jf.setdefaultcloseoperation(jframe.exit_on_close); } public static void main(string args[]){ new main(); } @override public void actionperformed(actionevent e) { // todo auto-generated method stub if(e.getsource()==jbtadd){ addmypanel(); } else if(e.getsource()==jbtdelete){ delmypanel(); } } public void addmypanel(){ system.out.println("ok"); mp=new mypanel(); mp.getfiletypeiconlabel().settext(string.valueof(mplist.size())); mp.setindexid(size); system.out.println(size); size++; mplist.add(0, mp); mp.addmouselistener(new mouselistener(){ @override public void mouseclicked(mouseevent e) { // todo auto-generated method stub if(2==e.getclickcount()){ system.out.println("indexind is"+mplist.get(0).getindexid()); //system.out.println(index); mplist.get(0).setbackground(color.yellow); } } @override public void mouseentered(mouseevent e) { // todo auto-generated method stub } @override public void mouseexited(mouseevent e) { // todo auto-generated method stub } @override public void mousepressed(mouseevent e) { // todo auto-generated method stub } @override public void mousereleased(mouseevent e) { // todo auto-generated method stub }}); jp.add(mplist.get(0)); jp.setpreferredsize(new dimension(500, 82*mplist.size())); //jp.validate(); js.validate(); //jp.repaint(); js.repaint(); } public void delmypanel(){ selectedid=getindexofmypanelbyid(); if(selectedid>=0){ int indexid=getindexofmypanelbyid(); jp.remove(mplist.get(indexid)); mplist.remove(indexid); jp.setpreferredsize(new dimension(500,82*mplist.size())); jp.repaint(); } } protected int getindexofmypanelbyid(){ iterator<mypanel> it=mplist.iterator(); for(int id=0;it.hasnext();id++){ mypanel mp; mp=it.next(); if(mp.isselected()){ return id; } } return -1; } }
here code of mypanel
class mypanel extends jpanel{ private static final long serialversionuid = 1l; private jprogressbar downloadprogress; private jlabel filetypeiconlabel,filenamelabel,downloadinfolabel,freelabel; private int indexid; private boolean isselected=false; protected mypanel(){ setlayout(null); downloadprogress=new jprogressbar(0,100); filetypeiconlabel=new jlabel("test"); filenamelabel=new jlabel("filenamelabel"); downloadinfolabel=new jlabel("downloadinfolabel"); freelabel=new jlabel("freelabel"); downloadprogress.setbounds(80, 44, 400, 18); downloadprogress.setstringpainted(true); //downloadprogress.setstring("88%"); filetypeiconlabel.setbounds(0, 0, 80, 80); filetypeiconlabel.setbackground(color.cyan); filetypeiconlabel.setopaque(true); filenamelabel.setbounds(80,0,400,22); filenamelabel.setbackground(color.black); filenamelabel.setopaque(true); downloadinfolabel.setbounds(80, 22, 400, 22); downloadinfolabel.setbackground(color.red); downloadinfolabel.setopaque(true); //downloadprogress.setvalue(50); freelabel.setbounds(80, 62, 400, 18); freelabel.setbackground(color.lightgray); freelabel.setopaque(true); add(downloadprogress); add(filetypeiconlabel); add(filenamelabel); add(downloadinfolabel); add(freelabel); } protected jlabel getfiletypeiconlabel() { return filetypeiconlabel; } protected int getindexid() { return indexid; } protected void setindexid(int indexid) { this.indexid = indexid; } protected boolean isselected() { return isselected; } protected void setselected(boolean isselected) { this.isselected = isselected; } }
for many components in 1 space, use cardlayout
seen in short example.
tips
jp.setpreferredsize(new dimension(500, 82*6));
see should avoid use of set(preferred|maximum|minimum)size methods in java swing? (yes.)
downloadprogress.setbounds(80, 44, 400, 18);
java guis might have work on number of platforms, on different screen resolutions & using different plafs. such not conducive exact placement of components. organize components robust gui, instead use layout managers, or combinations of them1, along layout padding & borders white space2.
edit 1
as aside, screen-shot screams jlist
custom renderer me. e.g.
import java.awt.*; import java.awt.event.actionevent; import javax.swing.*; import javax.swing.border.emptyborder; public class dymanicdownloadlist { // gui seen user (without frame) jpanel gui = new jpanel(new borderlayout(2, 2)); public void initgui() { gui.setborder(new emptyborder(2, 3, 2, 3)); jtoolbar tb = new jtoolbar(); gui.add(tb, borderlayout.page_start); final defaultlistmodel<download> listmodel = new defaultlistmodel<download>(); final jlist<download> list = new jlist<download>(listmodel); list.setcellrenderer(new downloadlistcellrenderer()); list.setvisiblerowcount(3); gui.add(new jscrollpane(list), borderlayout.center); action add = new abstractaction("add download") { @override public void actionperformed(actionevent e) { listmodel.addelement(new download()); } }; action delete = new abstractaction("delete download") { @override public void actionperformed(actionevent e) { int index = list.getselectedindex(); if (index < 0) { joptionpane.showmessagedialog( list, "select download delete!", "select download", joptionpane.error_message); } else { listmodel.removeelementat(index); } } }; tb.add(add); tb.addseparator(); tb.add(delete); (int ii = 0; ii < 2; ii++) { listmodel.addelement(new download()); } } public jcomponent getgui() { return gui; } public static void main(string[] args) { runnable r = new runnable() { @override public void run() { dymanicdownloadlist ddl = new dymanicdownloadlist(); ddl.initgui(); jframe f = new jframe("dynamic list"); f.add(ddl.getgui()); // ensures jvm closes after frame(s) closed , // non-daemon threads finished f.setdefaultcloseoperation(jframe.dispose_on_close); // see https://stackoverflow.com/a/7143398/418556 demo. f.setlocationbyplatform(true); // ensures frame minimum size needs // in order display components within f.pack(); // should done last, avoid flickering, moving, // resizing artifacts. f.setvisible(true); } }; // swing guis should created , updated on edt // http://docs.oracle.com/javase/tutorial/uiswing/concurrency swingutilities.invokelater(r); } } class download { download() { } } class downloadlistcellrenderer extends defaultlistcellrenderer { jpanel downloadpanel = new jpanel(new borderlayout(10, 10)); jpanel labelstack = new jpanel(new gridlayout(0, 1, 2, 2)); jlabel number = new jlabel("", swingconstants.center); jlabel source = new jlabel("file name label", swingconstants.center); jlabel info = new jlabel("download info label", swingconstants.center); jlabel free = new jlabel("free label", swingconstants.center); jprogressbar progress = new jprogressbar() { @override public dimension getpreferredsize() { dimension d = super.getpreferredsize(); return new dimension(400,d.height); } }; downloadlistcellrenderer() { downloadpanel.add(labelstack, borderlayout.center); labelstack.setopaque(false); number.setfont(number.getfont().derivefont(40f)); labelstack.add(source); labelstack.add(info); labelstack.add(progress); labelstack.add(free); downloadpanel.add(labelstack, borderlayout.center); downloadpanel.add(number, borderlayout.line_start); } @override public component getlistcellrenderercomponent( jlist list, object value, int index, boolean isselected, boolean cellhasfocus) { jlabel l = (jlabel) super.getlistcellrenderercomponent( list, value, index, isselected, cellhasfocus); downloadpanel.setbackground(l.getbackground()); number.settext("" + (index + 1)); return downloadpanel; } }
Comments
Post a Comment