Mega Code Archive

 
Categories / Java / 2D Graphics GUI
 

Buffered draw without flicker

import java.awt.BasicStroke; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.image.BufferedImage; import javax.swing.JFrame; import javax.swing.JPanel; public class BufferedDraw extends JPanel implements MouseListener,     MouseMotionListener {   Rectangle rect = new Rectangle(0, 0, 100, 50);   BufferedImage bi = new BufferedImage(5, 5, BufferedImage.TYPE_INT_RGB);   Graphics2D big;   int last_x, last_y;   boolean firstTime = true;   Rectangle area;   boolean pressOut = false;   public BufferedDraw() {     setBackground(Color.white);     addMouseMotionListener(this);     addMouseListener(this);   }   // Handles the event of the user pressing down the mouse button.   public void mousePressed(MouseEvent e) {     last_x = rect.x - e.getX();     last_y = rect.y - e.getY();     // Checks whether or not the cursor is inside of the rectangle while the     // user is pressing themouse.     if (rect.contains(e.getX(), e.getY())) {       updateLocation(e);     } else {       pressOut = true;     }   }   // Handles the event of a user dragging the mouse while holding down the   // mouse button.   public void mouseDragged(MouseEvent e) {     if (!pressOut) {       updateLocation(e);     }   }   // Handles the event of a user releasing the mouse button.   public void mouseReleased(MouseEvent e) {     if (rect.contains(e.getX(), e.getY())) {       updateLocation(e);     }   }   public void mouseMoved(MouseEvent e) {   }   public void mouseClicked(MouseEvent e) {   }   public void mouseExited(MouseEvent e) {   }   public void mouseEntered(MouseEvent e) {   }   public void updateLocation(MouseEvent e) {     rect.setLocation(last_x + e.getX(), last_y + e.getY());     repaint();   }   public void paint(Graphics g) {     update(g);   }   public void update(Graphics g) {     Graphics2D g2 = (Graphics2D) g;     if (firstTime) {       Dimension dim = getSize();       int w = dim.width;       int h = dim.height;       area = new Rectangle(dim);       bi = (BufferedImage) createImage(w, h);       big = bi.createGraphics();       rect.setLocation(w / 2 - 50, h / 2 - 25);       big.setStroke(new BasicStroke(8.0f));       firstTime = false;     }     big.setColor(Color.white);     big.clearRect(0, 0, area.width, area.height);     big.setPaint(Color.red);     big.draw(rect);     big.setPaint(Color.blue);     big.fill(rect);     g2.drawImage(bi, 0, 0, this);   }   private boolean checkRect() {     if (area == null) {       return false;     }     if (area.contains(rect.x, rect.y, 100, 50)) {       return true;     }     int new_x = rect.x;     int new_y = rect.y;     if ((rect.x + 100) > area.width) {       new_x = area.width - 99;     }     if (rect.x < 0) {       new_x = -1;     }     if ((rect.y + 50) > area.height) {       new_y = area.height - 49;     }     if (rect.y < 0) {       new_y = -1;     }     rect.setLocation(new_x, new_y);     return false;   }   public static void main(String s[]) {     JFrame f = new JFrame("BufferedShapeMover");     f.addWindowListener(new WindowAdapter() {       public void windowClosing(WindowEvent e) {         System.exit(0);       }     });     f.getContentPane().setLayout(new BorderLayout());     f.getContentPane().add(new BufferedDraw(), "Center");     f.pack();     f.setSize(new Dimension(550, 250));     f.show();   } }