swing - shape refresh on a full transparent window in Java -
this first question since find other questions far. here comes question: designed window on have 2 portions. left portion transparent , want draw refrashable shape on it. (in following, shapw square.) right portion opaque , won't draw shape on it. ok left portion, background shape not refrashable.
package haxbot; import java.awt.*; import java.awt.robot.*; import javax.swing.*; import java.awt.image.*; // import com.sun.awt.awtutilities; public class drawscreen extends javax.swing.jframe { public drawscreen() { initcomponents(); } //-------------------- automatically created --------------------------------- // <editor-fold defaultstate="collapsed" desc="generated code"> private void initcomponents() { jlabel1 = new javax.swing.jlabel(); jlabel2 = new javax.swing.jlabel(); jlabel5 = new javax.swing.jlabel(); jlabel6 = new javax.swing.jlabel(); jbutton1 = new javax.swing.jbutton(); setdefaultcloseoperation(javax.swing.windowconstants.exit_on_close); setalwaysontop(true); setcursor(new java.awt.cursor(java.awt.cursor.default_cursor)); setresizable(false); setundecorated(true); addmousemotionlistener(new java.awt.event.mousemotionadapter() { public void mousemoved(java.awt.event.mouseevent evt) { formmousemoved(evt); } }); jlabel1.settext("position:"); jlabel2.setforeground(new java.awt.color(255, 0, 0)); jlabel2.settext("[ 123, 134]"); jlabel5.settext("color:"); jlabel6.setforeground(new java.awt.color(255, 0, 0)); jlabel6.settext("[ 255, 255, 255]"); jbutton1.setbackground(new java.awt.color(255, 0, 0)); jbutton1.setfont(new java.awt.font("tahoma", 1, 11)); // noi18n jbutton1.setforeground(new java.awt.color(255, 0, 0)); jbutton1.settext("x"); jbutton1.addactionlistener(new java.awt.event.actionlistener() { public void actionperformed(java.awt.event.actionevent evt) { jbutton1actionperformed(evt); } }); javax.swing.grouplayout layout = new javax.swing.grouplayout(getcontentpane()); getcontentpane().setlayout(layout); layout.sethorizontalgroup( layout.createparallelgroup(javax.swing.grouplayout.alignment.leading) .addgroup(javax.swing.grouplayout.alignment.trailing, layout.createsequentialgroup() .addcontainergap(853, short.max_value) .addgroup(layout.createparallelgroup(javax.swing.grouplayout.alignment.leading) .addgroup(javax.swing.grouplayout.alignment.trailing, layout.createparallelgroup(javax.swing.grouplayout.alignment.leading, false) .addgroup(layout.createsequentialgroup() .addcomponent(jlabel1) .addpreferredgap(javax.swing.layoutstyle.componentplacement.related, javax.swing.grouplayout.default_size, short.max_value) .addcomponent(jlabel2, javax.swing.grouplayout.preferred_size, 88, javax.swing.grouplayout.preferred_size)) .addgroup(javax.swing.grouplayout.alignment.trailing, layout.createsequentialgroup() .addcomponent(jlabel5, javax.swing.grouplayout.preferred_size, 40, javax.swing.grouplayout.preferred_size) .addgap(26, 26, 26) .addcomponent(jlabel6, javax.swing.grouplayout.preferred_size, 88, javax.swing.grouplayout.preferred_size))) .addcomponent(jbutton1, javax.swing.grouplayout.alignment.trailing))) ); layout.setverticalgroup( layout.createparallelgroup(javax.swing.grouplayout.alignment.leading) .addgroup(layout.createsequentialgroup() .addcomponent(jbutton1, javax.swing.grouplayout.preferred_size, 15, javax.swing.grouplayout.preferred_size) .addgap(58, 58, 58) .addgroup(layout.createparallelgroup(javax.swing.grouplayout.alignment.baseline) .addcomponent(jlabel2) .addcomponent(jlabel1)) .addgap(18, 18, 18) .addgroup(layout.createparallelgroup(javax.swing.grouplayout.alignment.baseline) .addcomponent(jlabel6) .addcomponent(jlabel5)) .addcontainergap(338, short.max_value)) ); pack(); }// </editor-fold> //-------------------- automatically created (end) --------------------------------- private void formmousemoved(java.awt.event.mouseevent evt) { mousepos = evt.getpoint(); int mx = (int) mousepos.getx(); int = (int) mousepos.gety(); mousepos = evt.getpoint(); jlabel2.settext("[ " + mx + ", " + + " ]"); getcolor(mx + (int) wind.getlocation().getx(), + (int) wind.getlocation().gety()); paint(this.getgraphics()); } private void jbutton1actionperformed(java.awt.event.actionevent evt) { system.exit(0); } public color getcolor(int mx, int my) { try { robot = new robot(); } catch (awtexception awte) { awte.printstacktrace(); } rectangle capturesize = new rectangle(mx - 15, - 15, 30, 30); img = robot.createscreencapture(capturesize); currcolor = robot.getpixelcolor(mx, my); (int = 0; < img.getwidth(); i++) { (int j = 0; j < img.getheight(); j++) { int x = img.getrgb(i, j); } } jlabel6.settext("[ " + currcolor.getred() + ", " + currcolor.getgreen() + ", " + currcolor.getblue() + "]"); return currcolor; } public static void main(string args[]) { graphicsobtained = false; java.awt.eventqueue.invokelater(new runnable() { public void run() { wind = new drawscreen(); wind.setvisible(true); wind.setlocation(182, 154); wind.setdefaultcloseoperation(exit_on_close); try { //uimanager.setlookandfeel("javax.swing.plaf.metal.metallookandfeel"); uimanager.setlookandfeel("com.sun.java.swing.plaf.windows.windowslookandfeel"); swingutilities.updatecomponenttreeui(wind); } catch (exception ex) { ex.printstacktrace(); } // add transparency // awtutilities.setwindowopacity(wind, (float) 0.6); currcolors = new color[10][10]; } }); } public void paint(graphics g) { leftscreen = (graphics2d) g.create(); leftscreen.setclip(0, 0, 840, 410); if (mousepos != null) { //leftscreen.clearrect((int) mousepos.getx() - 150, (int) mousepos.gety() - 150, 300, 300); leftscreen.drawrect((int) mousepos.getx() - 15, (int) mousepos.gety() - 15, 30, 30); } rightscreen = (graphics2d) g.create(); rightscreen.setclip(850, 0, this.getwidth(), 410); super.paint(rightscreen); rightscreen.dispose(); leftscreen.dispose(); if (mousepos != null) { //g2d1.clearrect(0, 0, 520, 430); } /*g2d.setcolor(color.red); g2d.clearrect(55, 430, 90, 10); if (mousepos != null) g2d.drawstring("[ " + mousepos.getx() + ", " + mousepos.gety() + " ]", 55, 440); else g2d.drawstring("[ 0, 0 ]", 55, 440);*/ } // variables declaration - not modify private javax.swing.jbutton jbutton1; private javax.swing.jlabel jlabel1; private javax.swing.jlabel jlabel2; private javax.swing.jlabel jlabel5; private javax.swing.jlabel jlabel6; // end of variables declaration private point mousepos; private point playerpos; private color currcolor; private static color[][] currcolors; private static drawscreen wind; private bufferedimage img; private static boolean graphicsobtained; private graphics initialsection; private graphics2d leftscreen, rightscreen; robot robot = null; }
---------------------- edit (second code) -------------------------------------------
import java.awt.event.mouseevent; import javax.swing.*; import java.awt.*; // 3) in class (which extends jframe) public class jframetrial extends jframe { public static void main(string[] args) { mousepos = new point(0, 0); jframetrial jft = new jframetrial(); jft.setdefaultcloseoperation(exit_on_close); jft.setsize(300, 300); jft.setvisible(true); } public jframetrial() { /* 4) set contentpane using setcontentpane class created extending jcomponent.*/ jct = new jcomponenttrial(150, 150); setcontentpane(jct); addmousemotionlistener(new java.awt.event.mousemotionadapter() { public void mousemoved(mouseevent e) { mousepos = e.getpoint(); getcontentpane().repaint(); } }); } private jcomponenttrial jct; private static point mousepos; // 1) have create class extends jcomponent. private class jcomponenttrial extends jcomponent { public jcomponenttrial(int x, int y) { setsize(x, y); } // 2)there override paintcomponent() method whatever want draw. @override public void paintcomponent(graphics g) { graphics gg = g.create(); gg.setcolor(color.red); gg.drawrect((int) mousepos.getx() - 15, (int) mousepos.gety() - 15, 30, 30); gg.dispose(); } } }
a few suggestions:
- draw in class extends jpanel or jcomponent, not jframe.
- draw in overridden paintcomponent method, not paint method.
- the first line of paintcomponent method should call
super.paintcomponent(g);
- don't dispose of graphics object passed in paintcomponent (or paint) parameter. dispose graphics or graphics2d objects have created.
Comments
Post a Comment