Sunday, 15 September 2013

java - How to resize BufferedImage but conserve it's Graphics? -



java - How to resize BufferedImage but conserve it's Graphics? -

i have own custom command maintains backing image it's content. buffer of type bufferedimage.

attention! usage of backing image due requirements. don't teach me draw within paintcomponent()

currently resizing image in next way:

@override public void setbounds(int x, int y, int width, int height) { if( bufferedimage == null ) { bufferedimage = new bufferedimage(width, height, bufferedimage.type_int_argb); } else { if( bufferedimage.getwidth() < width || bufferedimage.getheight() < height ) { bufferedimage newimage = new bufferedimage(width, height, bufferedimage.type_int_argb); newimage.creategraphics().drawimage(bufferedimage, 0, 0, null); bufferedimage = newimage; } } super.setbounds(x, y, width, height); }

unfortunately, requires create new bufferedimage object , hence makes obtained graphics object invalid.

so have have own method

public graphics2d createimagegraphics() { if( bufferedimage != null ) { homecoming bufferedimage.creategraphics(); } else { homecoming null; } }

although override getgraphics().

is possible resize image conserve graphics object?

here little illustration of how perform custom painting in swing:

import java.awt.borderlayout; import java.awt.color; import java.awt.dimension; import java.awt.graphics; import java.awt.event.actionevent; import javax.swing.abstractaction; import javax.swing.jbutton; import javax.swing.jframe; import javax.swing.jpanel; import javax.swing.swingutilities; public class jframetest { private boolean drawoval = false; protected void initui() { final jpanel panel = new jpanel() { @override protected void paintcomponent(graphics g) { super.paintcomponent(g); if (drawoval) { g.setcolor(color.blue); g.drawoval(0, 0, 100, 100); } } @override public dimension getpreferredsize() { homecoming new dimension(100, 100); } }; abstractaction drawaction = new abstractaction("draw") { @override public void actionperformed(actionevent e) { drawoval = true; panel.repaint(); } }; jbutton drawbutton = new jbutton(drawaction); jpanel buttonpanel = new jpanel(); buttonpanel.add(drawbutton); jframe frame = new jframe(); frame.add(panel, borderlayout.center); frame.add(buttonpanel, borderlayout.south); frame.setdefaultcloseoperation(jframe.exit_on_close); frame.pack(); frame.setvisible(true); } public static void main(string[] args) { swingutilities.invokelater(new runnable() { @override public void run() { new jframetest().initui(); } }); } }

java swing graphics awt

No comments:

Post a Comment