user interface - how to avoid Java graphics2D components to erase when minimizing or pooping up of Joptionpane? -
i working on java class representing graph data structure collage , , have problem when use graphics2d
component draw graph . panting nodes of graph on spacifiec range randomly , when press add vertex button , have put drawing code on action of add vertex button , makes me not using paintcomponent()
or paint()
method , when minimize or joptionepane popped , entire graphics had drawn disappears !!
and here code, note : graph , stackx , queue classes implementations made me on same package
package graphs; import javax.swing.jlayeredpane; import javax.swing.joptionpane; import javax.swing.jpanel; import javax.swing.jrootpane; import javax.swing.jtextfield; import javax.swing.jbutton; import javax.swing.border.titledborder; import java.awt.color; import java.awt.font; import java.awt.graphics; import java.awt.graphics2d; import javax.swing.jscrollpane; import datastrucutres.trees.btnode; import java.awt.event.actionlistener; import java.awt.event.actionevent; import java.util.random; public class graphgui extends jpanel { private jpanel panel; private jtextfield vetxtxt; private jbutton vertxbtn; private jtextfield ed1txt; private jtextfield ed2txt; private jbutton edbtn; private jpanel panel_1; private jbutton creatbtn; private jscrollpane scrollpane; static int j = 1; static graph mygraph; private jbutton btndfs; private jbutton btnbfs; boolean check; int[] x = new int[10]; int[] y = new int[10]; int w, h; graphics2d g; /** * create panel. * */ public graphgui() { setbackground(color.dark_gray); setlayout(null); panel_1 = new jpanel(); panel_1.setborder(new titledborder(null, "controls", titledborder.leading, titledborder.top, null, new color(48, 48, 48))); panel_1.setbounds(12, 117, 248, 188); add(panel_1); panel_1.setlayout(null); vetxtxt = new jtextfield(); vetxtxt.setenabled(false); vetxtxt.setbounds(7, 23, 124, 31); panel_1.add(vetxtxt); vetxtxt.setcolumns(10); vertxbtn = new jbutton("add vertex"); vertxbtn.addactionlistener(new actionlistener() { public void actionperformed(actionevent arg0) { try { check = true; string string = vetxtxt.gettext().touppercase(); char r = string.charat(0); mygraph.addvertex(r); vetxtxt.settext(null); int x = (int) ((math.random() * (700)) % 349 )+300; int y = (int) ((math.random() * (780)) % 349); int width = (int) (math.random() * (700 / 4)); int height = (int) (math.random() * (780 / 4)); if (x + width > getwidth()) { x = getwidth() - width; } if (y + height > getheight()) { y = getheight() - height; } color color = new color((int) (math.random() * 255), (int) (math.random() * 255), (int) (math.random() * 255)); graphics2d g = (graphics2d) getgraphics(); g.setcolor(color); g.drawoval(x, y, 30, 30); g.drawstring(r + "", x + 10, y + 18); x[h] = x; y[w] = y; h++; w++; j++; } catch (arrayindexoutofboundsexception e) { joptionpane.showmessagedialog(null, "graph full of vertexes", "erorr", joptionpane.error_message); vetxtxt.settext(null); } catch (exception ex) { joptionpane.showmessagedialog(null, "enter data pleas!", "erorr", joptionpane.error_message); vetxtxt.settext(null); } } }); vertxbtn.setenabled(false); vertxbtn.setbounds(141, 24, 100, 29); panel_1.add(vertxbtn); ed1txt = new jtextfield(); ed1txt.setenabled(false); ed1txt.setbounds(7, 84, 50, 31); panel_1.add(ed1txt); ed1txt.setcolumns(10); ed2txt = new jtextfield(); ed2txt.setenabled(false); ed2txt.setbounds(81, 84, 50, 31); panel_1.add(ed2txt); ed2txt.setcolumns(10); edbtn = new jbutton("add edge"); edbtn.addactionlistener(new actionlistener() { public void actionperformed(actionevent arg0) { try { int m = integer.parseint(ed1txt.gettext()); int v = integer.parseint(ed2txt.gettext()); ed1txt.settext(null); ed2txt.settext(null); mygraph.addedge(m, v); g.drawline(x[m] + 8, y[m] + 8, x[v] + 8, y[v] + 8); } catch (exception e) { joptionpane.showmessagedialog(null, "entered edges out of graph !", "erorr", joptionpane.error_message); } } }); edbtn.setenabled(false); edbtn.setbounds(141, 85, 100, 29); panel_1.add(edbtn); btnbfs = new jbutton("bfs"); btnbfs.addactionlistener(new actionlistener() { public void actionperformed(actionevent e) { try { mygraph.bfs(); joptionpane.showmessagedialog(null, "bfs : " + mygraph.gets()); } catch (exception e2) { joptionpane.showmessagedialog(null, "graph empty of vertexes", "erorr", joptionpane.error_message); vetxtxt.settext(null); } } }); btnbfs.setenabled(false); btnbfs.setbounds(27, 139, 93, 29); panel_1.add(btnbfs); btndfs = new jbutton("dfs"); btndfs.setenabled(false); btndfs.setbounds(129, 139, 93, 29); panel_1.add(btndfs); btndfs.addactionlistener(new actionlistener() { public void actionperformed(actionevent e) { try { mygraph.dfs(); graphics2d g = (graphics2d) getgraphics(); joptionpane.showmessagedialog(null, "dfs : " + mygraph.gets()); } catch (exception e2) { joptionpane.showmessagedialog(null, "graph empty of vertexes", "erorr", joptionpane.error_message); vetxtxt.settext(null); } } }); creatbtn = new jbutton("creat graph"); creatbtn.addactionlistener(new actionlistener() { public void actionperformed(actionevent arg0) { g = (graphics2d) getgraphics(); mygraph = new graph(); vertxbtn.setenabled(true); vetxtxt.setenabled(true); ed1txt.setenabled(true); ed2txt.setenabled(true); edbtn.setenabled(true); btnbfs.setenabled(true); btndfs.setenabled(true); creatbtn.setvisible(false); joptionpane .showmessagedialog( null, "a graph structure consisting of set of arrays (also called dimensions) , set of edges . edge pair of vertices . 2 vertices called edge endpoints.", "graph", joptionpane.plain_message); } }); creatbtn.setbounds(6, 395, 125, 21); add(creatbtn); }
}
so when minimize or joptionepane popped , entire graphics had drawn gone !
don't use getgraphics() custom painting. painting temporary have noticed.
so have put drawing code on action of add vertex button , makes me not using paintcomponent()
no, action should invoke method on custom painting panel add vertex. class need keep list of vertex's paint , custom code in paintcomponent()
method iterate through list , paint vertex's.
or, other option have action paint on bufferedimage. can paint bufferedimage in paintcomponent() method (or add bufferedimage jlabel using imageicon).
see custom painting approaches working examples of doing custom painting either list or bufferedimage.
Comments
Post a Comment