Problems diplaying image on double buffered Panel

Hello, I made a very simple image visualizer using double buffer. I load the images using ImageIO.read(File file) and display the image on the Panel by drawing it first to a buffer Image using a buffer Graphics, and then painting the buffer Image on the Panel surface. The problem is: sometimes the images are not dislplayed completely, and repainting again by calling repaint() does not work, it`s only displayed correctly if I try to resize the window. When I do the resizeing the paint function is called by a function other then repaint(), update(Graphics g) and paintComponents(Graphics g), and, this time, the paint() display the image correctly.
What should I do to always display the entire image? I apreciate any help.
Thankyou. Gustavo Peixoto
The code:
import java.awt.Graphics;
import java.awt.Panel;
import java.awt.image.BufferedImage;
public abstract class BufferGraphicsPanel extends Panel {
     private Graphics bufferGraphics;
     private BufferedImage bufferImage;
     private int bufferWidth;
     private int bufferHeight;
     public BufferGraphicsPanel() {
     public void resetBuffer() {
          bufferWidth = getWidth();
          bufferHeight = getHeight();
          if (bufferGraphics != null) {
               bufferGraphics.dispose();
               bufferGraphics = null;
          if (bufferImage != null) {
               bufferImage.flush();
               bufferImage = null;
          System.gc();
          bufferImage = (BufferedImage) createImage(bufferWidth, bufferHeight);
          bufferGraphics = bufferImage.getGraphics();
     public void paint(Graphics g) {
          System.out.println("paint");
          if (bufferWidth != getWidth() || bufferHeight != getHeight()
                    || bufferImage == null || bufferGraphics == null) {
               resetBuffer();
          bufferGraphics.clearRect(0, 0, bufferWidth, bufferHeight);
          paintBuffer(bufferGraphics);
          g.drawImage(bufferImage, 0, 0, this);
     public void update(Graphics g) {
          System.out.println("update");
          paint(g);
     public void repaint(){
          System.out.println("repaint");
          super.repaint();
     public abstract void paintBuffer(Graphics bufg);
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class VisualisadorDeImagens extends BufferGraphicsPanel {
     BufferedImage image;
     Frame frame;
     String dirPath;
     String fileNames[];
     int x, y;
     int pos;
     public static void main(String[] args) {
          new VisualisadorDeImagens(
                    "C:\\Documents and Settings\\All Users\\Documents\\My Pictures\\Sample Pictures");
     public VisualisadorDeImagens(String dirPath) {
          this.dirPath = dirPath;
          fileNames = new File(dirPath).list();
          frame = new Frame();
          frame.setSize(400, 200);
          frame.add(this);
          frame.addKeyListener(new KeyAdapter() {
               public void keyPressed(KeyEvent e) {
                    if (e.getKeyCode() == KeyEvent.VK_ENTER) {
                         visualisar();
                    super.keyPressed(e);
          frame.addWindowListener(new WindowAdapter() {
               public void windowClosing(WindowEvent e) {
                    super.windowClosing(e);
                    frame.dispose();
                    System.gc();
                    System.exit(0);
          pos = 1;
          frame.setVisible(true);
     public void visualisar() {
          if (loadImage(dirPath + "\\" + fileNames[pos - 1])) {
               frame.setSize(image.getWidth(), image.getHeight() + 30);
          } else {
               frame.setSize(400, 200);
          frame.setTitle(fileNames[pos - 1]);
          pos = (pos % fileNames.length) + 1;
          repaint();
     public void paintBuffer(Graphics bufg) {
          if (image != null) {
               x = (frame.getWidth() / 2) - (image.getWidth() / 2);
               y = (frame.getHeight() / 2) - (image.getHeight() / 2);
               bufg.drawImage(image, x, y, this);
          } else
               bufg.drawString("Imagem indispon�vel", 130, 100);
     public boolean loadImage(String path) {
          try {
               image = ImageIO.read(new File(path));
          } catch (IOException e) {
               e.printStackTrace();
          if (image != null)
               return true;
          return false;
}

Hi camickr, thanks for the tip, I understood the approach used, but it`s different of mine. I know that what I`m doing works, I think I`m missing something. Thankyou.
ps. here is the code formated correctly:
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class VisualisadorDeImagens extends BufferGraphicsPanel {
     BufferedImage image;
     Frame frame;
     String dirPath;
     String fileNames[];
     int x, y;
     int pos;
     public static void main(String[] args) {
          new VisualisadorDeImagens(
                    "C:\\Documents and Settings\\All Users\\Documents\\My Pictures\\Sample Pictures");
     public VisualisadorDeImagens(String dirPath) {
          this.dirPath = dirPath;
          fileNames = new File(dirPath).list();
          frame = new Frame();
          frame.setSize(400, 200);
          frame.add(this);
          frame.addKeyListener(new KeyAdapter() {
               public void keyPressed(KeyEvent e) {
                    if (e.getKeyCode() == KeyEvent.VK_ENTER) {
                         visualisar();
                    super.keyPressed(e);
          frame.addWindowListener(new WindowAdapter() {
               public void windowClosing(WindowEvent e) {
                    super.windowClosing(e);
                    frame.dispose();
                    System.gc();
                    System.exit(0);
          pos = 1;
          frame.setVisible(true);
     public void visualisar() {
          if (loadImage(dirPath + "\\" + fileNames[pos - 1])) {
               frame.setSize(image.getWidth(), image.getHeight());
          } else {
               frame.setSize(400, 200);
          frame.setTitle(fileNames[pos - 1]);
          pos = (pos % fileNames.length) + 1;
          repaint();
     public void paintBuffer(Graphics bufg) {
          if (image != null) {
               x = (frame.getWidth() / 2) - (image.getWidth() / 2);
               y = (frame.getHeight() / 2) - (image.getHeight() / 2);
               bufg.drawImage(image, x, y, this);
          } else
               bufg.drawString("Imagem indispon�vel", 130, 100);
     public boolean loadImage(String path) {
          try {
               image = ImageIO.read(new File(path));
          } catch (IOException e) {
               e.printStackTrace();
          if (image != null)
               return true;
          return false;
import java.awt.Graphics;
import java.awt.Panel;
import java.awt.image.BufferedImage;
public abstract class BufferGraphicsPanel extends Panel {
     private Graphics bufferGraphics;
     private BufferedImage bufferImage;
     private int bufferWidth;
     private int bufferHeight;
     public BufferGraphicsPanel() {
     public void resetBuffer() {
          bufferWidth = getWidth();
          bufferHeight = getHeight();
          if (bufferGraphics != null) {
               bufferGraphics.dispose();
               bufferGraphics = null;
          if (bufferImage != null) {
               bufferImage.flush();
               bufferImage = null;
          System.gc();
          bufferImage = (BufferedImage) createImage(bufferWidth, bufferHeight);
          bufferGraphics = bufferImage.getGraphics();
     public void paint(Graphics g) {
          System.out.println("paint");
          if (bufferWidth != getWidth() || bufferHeight != getHeight()
                    || bufferImage == null || bufferGraphics == null) {
               resetBuffer();
          bufferGraphics.clearRect(0, 0, bufferWidth, bufferHeight);
          paintBuffer(bufferGraphics);
          g.drawImage(bufferImage, 0, 0, this);
     public void update(Graphics g) {
          System.out.println("update");
          paint(g);
     public void repaint(){
          System.out.println("repaint");
          super.repaint();
     public abstract void paintBuffer(Graphics bufg);
}

Similar Messages

  • Properly (?) Double Buffered Applet is really Choppy

    Hi all. I looked around here for the proper way to double buffer an applet, and I think I've got it, but it's realllly choppy when it runs. (It's a little 2d jump 'n run game with not much in it yet). If you have any idea why, please tell =) Thanks!
    public class Game extends JApplet implements KeyListener, Runnable
         //doublebuffer stuff
         Graphics bufferGraphics;
         Image offscreenImage;
         Dimension dim;
         //constants
         int SCREEN_WIDTH = 800;
         int SCREEN_HEIGHT = 600;
         int SPRITE_SIZE = 64;
         Color BGColor = Color.white;
         int PLAYER_SPEED_X = 10;
         int PLAYER_JUMP_SPEED = 20;
         int GRAVITY_ACCEL = 1;
         //directional constants
         int LEFT = -1;
         int RIGHT = 1;
         int STOPPED = 0;
         int UP = -1;
         int DOWN = 1;
         //images
         Image playerImage;
         //movement
         boolean freeFall = true;
         int playerDirX = STOPPED;
         int playerVelY = 0;
         int playerPosX = 0;
         int playerPosY = 0;
         //game control variables
         boolean gameIsRunning = false;
         Thread t;
         int i = 0;
         public void init()
              addKeyListener(this);
              gameIsRunning = true;
              //prepare offscreen image for double buffering
              setSize(800,600);
              dim = getSize();
              offscreenImage = createImage(dim.width,dim.height);
              bufferGraphics = offscreenImage.getGraphics();
              playerImage = getImage(getDocumentBase(),"images/playerRight.gif");
              t = new Thread(this);
              t.start();
         public void run()
              while(gameIsRunning)
                   try
                        t.sleep(33);
                   catch (InterruptedException e) {}
                   playerPosX += playerDirX*PLAYER_SPEED_X;
                   playerPosY -= playerVelY;
                   if(freeFall)
                        playerVelY -= GRAVITY_ACCEL;
                   //wraparound
                   if(playerPosX < 0)
                        playerPosX = 0;
                   if(playerPosX > SCREEN_WIDTH - SPRITE_SIZE)
                        playerPosX = SCREEN_WIDTH - SPRITE_SIZE;
                   //stop at the floor
                   if(playerPosY > SCREEN_HEIGHT - SPRITE_SIZE)
                        freeFall = false;
                        playerVelY = 0;
                        playerPosY = SCREEN_HEIGHT - SPRITE_SIZE;
                   repaint();
         public void keyPressed(KeyEvent e)
              //move right
              if(e.getKeyCode() == KeyEvent.VK_RIGHT ||
                        e.getKeyCode() == KeyEvent.VK_D)
                   playerImage = getImage(getDocumentBase(),"images/playerRight.gif");
                   playerDirX = RIGHT;
              //move left
              if(e.getKeyCode() == KeyEvent.VK_LEFT ||
                        e.getKeyCode() == KeyEvent.VK_A)
                   playerImage = getImage(getDocumentBase(),"images/playerLeft.gif");
                   playerDirX = LEFT;
              //jump
              if(e.getKeyCode() == KeyEvent.VK_SPACE ||
                        e.getKeyCode() == KeyEvent.VK_W ||
                        e.getKeyCode() == KeyEvent.VK_UP)
                   //allow jumping if we're standing on a surface
                   if(playerPosY == SCREEN_HEIGHT - SPRITE_SIZE ||
                             playerPosX == 0 ||
                             playerPosX == SCREEN_WIDTH - SPRITE_SIZE)
                        if(playerPosX == 0)
                             playerDirX = RIGHT;
                             playerImage =
                                  getImage(getDocumentBase(),"images/playerRight.gif");
                        if(playerPosX == SCREEN_WIDTH - SPRITE_SIZE)
                             playerDirX = LEFT;
                             playerImage =
                                  getImage(getDocumentBase(),"images/playerLeft.gif");
                        freeFall = true;
                        playerVelY = PLAYER_JUMP_SPEED;
         public void keyReleased(KeyEvent e)
              //stop moving right
              if(e.getKeyCode() == KeyEvent.VK_RIGHT ||
                        e.getKeyCode() == KeyEvent.VK_D)
                   if(playerDirX == RIGHT)
                        playerDirX = STOPPED;
              //stop moving left
              if(e.getKeyCode() == KeyEvent.VK_LEFT ||
                        e.getKeyCode() == KeyEvent.VK_A)
                   if(playerDirX == LEFT)
                        playerDirX = STOPPED;
         public void keyTyped(KeyEvent e)
         public void paint(Graphics g)
              //clear screen
              bufferGraphics.setColor(Color.white);
              bufferGraphics.fillRect(0,0,SCREEN_WIDTH,SCREEN_HEIGHT);
              //draw the player
              bufferGraphics.drawImage(playerImage,playerPosX,playerPosY,this);
              g.drawImage(offscreenImage,0,0,this);
         public void stop()
              t.stop();
        public void update(Graphics g)
             paint(g);
    }

    It looks fine to me, but don't reload the player images every time. If you need a different image you should read up on AffineTransform and do some rotations etc, or at least have the 4 images in an array or something.
    P.S. stop is deprecated for threads. If you are done with the thread null it. That being said, if you are making this as an applet, make sure you can restart or reload it properly by testing it with the appletvier.
    Good luck in your work.

  • Problem with Double Buffering and Swing

    Hi
    I made a game and basically it works pretty well, my only problem is it flickers really badly right now. I read up on a whole lot of forums about double buffering and none of those methods seemed to work. Then I noticed that Swing has double buffering built in so I tried that but then I get compilation errors and I'm really not sure why. My original code was a console application and worked perfectly, then I ported it into a JApplet and it still works but it flickers and thats what I'm tryign to fix now.
    The code below is in my main class under the constructor.
    Heres the double buffering code I'm trying to use, I'm sure you all seen it before lol
    public void update(Graphics g)
              // initialize buffer
              if (dbImage == null)
                   dbImage = createImage(this.getSize().width, this.getSize().height);
                   dbg = dbImage.getGraphics();
              // clear screen in background
              dbg.setColor(getBackground());
              dbg.fillRect(0, 0, this.getSize().width, this.getSize().height);
              // draw elements in background
              dbg.setColor(getForeground());
              paint(dbg);
              // draw image on the screen
              g.drawImage(dbImage, 0, 0, this);
         }My paint is right under neath and heres how it looks
    This snipet of code works but when I change the method to
    public paintComponent(Graphics g){
    super.paintComponent(g)...
    everythign stops working and get a compilation error and says that it can't find paintComponent in javax.swing.JFrame.
    public void paint(Graphics g)
              super.paint(g);
              //if game starting display menue
              if (show_menue)
                   //to restart lives if player dies
                   lives = 3;
                   menue.draw_menue(g);
                   menue_ufo1.draw_shape(g);
                   menue_ufo2.shape_color = Color.DARK_GRAY;
                   menue_ufo2.draw_shape(g);
                   menue_ufo3.shape_color = Color.BLUE;
                   menue_ufo3.draw_shape(g);
                   menue_ufo4.shape_color = new Color(82, 157, 22);
                   menue_ufo4.draw_shape(g);
                   menue_ufo5.draw_shape(g);
                   menue_ufo6.shape_color = new Color(130, 3, 3); ;
                   menue_ufo6.draw_shape(g);
                   menue_turret.draw_ship(g);
                   menue_ammo.draw_ammo(g);
              else
                   //otherwise redraw game objects
                   gunner.draw_ship(g);
                   y_ammo.draw_ammo(g);
                   grass.draw_bar(g);
                   o_ufo.draw_shape(g);
                   b_ufo.draw_shape(g);
                   m_ufo.draw_shape(g);
                   s_ufo.draw_shape(g);
                   z_ufo.draw_shape(g);
                   xx_ufo.draw_shape(g);
                   info.draw_bar(g);
                   live_painter.draw_lives(g, lives);
                   score_painter.draw_score(g, score);
                   level_display.draw_level(g, level);
                   explosion.draw_boom(g);
         }I just want to get rid of the flickering for now so any help will be greatly appreciated. Depending which will be simpler I can either try to double buffer this program or port it all to swing but I'm not sure which elements are effected by AWT and which by Swing. Also I read some of the Java documentation but couldn't really understand how to implement it to fix my program.
    Thanks in advance
    Sebastian

    This is a simple animation example quickly thrown together. I have two classes, an animation panel which is a JPanel subclass that overrides paintComponent and draws the animation, and a JApplet subclass that simply holds the animation panel in the applet's contentpane:
    SimpleAnimationPanel.java
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Point;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    import java.net.MalformedURLException;
    import java.net.URL;
    import javax.imageio.ImageIO;
    import javax.swing.JPanel;
    import javax.swing.Timer;
    class SimpleAnimationPanel extends JPanel
        private static final int DELAY = 20;
        public static final int X_TRANSLATION = 2;
        public static final int Y_TRANSLATION = 2;
        private Point point = new Point(5, 32);
        private BufferedImage duke = null;
        private Timer timer = new Timer(DELAY, new TimerAction());
        public SimpleAnimationPanel()
            try
                // borrow an image from sun.com
                duke = ImageIO.read(new URL(
                        "http://java.sun.com/products/plugin/images/duke.wave.med.gif"));
            catch (MalformedURLException e)
                e.printStackTrace();
            catch (IOException e)
                e.printStackTrace();
            setPreferredSize(new Dimension(600, 400));
            timer.start();
        // do our drawing here in the paintComponent override
        @Override
        protected void paintComponent(Graphics g)
            super.paintComponent(g);
            if (duke != null)
                g.drawImage(duke, point.x, point.y, this);
        private class TimerAction implements ActionListener
            @Override
            public void actionPerformed(ActionEvent e)
                int x = point.x;
                int y = point.y;
                Dimension size = SimpleAnimationPanel.this.getSize();
                if (x > size.width)
                    x = 0;
                else
                    x += X_TRANSLATION;
                if (y > size.height)
                    y = 0;
                else
                    y += Y_TRANSLATION;
                point.setLocation(new Point(x, y)); // update the point
                SimpleAnimationPanel.this.repaint();
    }AnimationApplet.java
    import java.lang.reflect.InvocationTargetException;
    import javax.swing.JApplet;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    public class AnimationApplet extends JApplet
        public void init()
            try
                SwingUtilities.invokeAndWait(new Runnable()
                    public void run()
                        // construct the panel
                        JPanel simpleAnimation = new SimpleAnimationPanel();
                        // put it in the contentPane of the JApplet
                        getContentPane().add(simpleAnimation);
                        setSize(simpleAnimation.getPreferredSize());
            catch (InterruptedException e)
                e.printStackTrace();
            catch (InvocationTargetException e)
                e.printStackTrace();
    }Here's a 3rd bonus class that shows how to put the JPanel into a stand-alone program, a JFrame. It's very similar to doing it in the JApplet:
    AnimationFrame.java
    import javax.swing.JFrame;
    public class AnimationFrame
        private static void createAndShowUI()
            JFrame frame = new JFrame("SimpleAnimationPanel");
            frame.getContentPane().add(new SimpleAnimationPanel());
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        public static void main(String[] args)
            java.awt.EventQueue.invokeLater(new Runnable()
                public void run()
                    createAndShowUI();
    }Edited by: Encephalopathic on Mar 15, 2008 11:01 PM

  • Panel refreshing and double buffering

    Hi all swing experts
    Could any one solve the problem.I have an application,which is having a JSplit pane.
    On the left of the JSplit pane , there is a tree. When u click a node from the tree
    that will be selected and you can place that node into the right side panel.
    And the same way you can click an another node (redirection or sink) and drop into the
    panel.you can draw a line by clicking the source and the sink / or redirection.
    The line is getting drawn dynamically by getting the x,y coordinates of the node.
    once the line is drawn am storing the line into vector, since this is getting drawn
    dynamically once if i minimize and maxmize it will disappear.
    For avoiding this am trying to redraw the old line from the vector when the window
    is getting activated, here the problem starts it draws the line but the line
    is getting disappeared immly.
    HOW DO I SOLVE THIS?
    is it possible to solve this problem with double buffering tech? if so how?
    PL HELP.
    Software - Visual Tool
    Last Modified -7/23/01
    sami
    import java.awt.*;
    import java.awt.event.*;
    import java.io.*;
    import java.util.*;
    import javax.swing.*;
    import javax.swing.border.TitledBorder;
    import javax.swing.event.TreeSelectionEvent;
    import javax.swing.event.TreeSelectionListener;
    import javax.swing.plaf.FontUIResource;
    import javax.swing.tree.*;
    import java.lang.System;
    import java.net.*;
    import java.awt.image.*;
    import javax.swing.event.*;
    public class CompTree extends JFrame implements TreeSelectionListener,WindowListener{      
    // Swing components declarations     
         public JSplitPane jSplitPane1,jSplitPaneTop;
         public JScrollPane treeScrollPane,splitScrollPane;     
    public JTree mainTree,jtree ;
    public static DefaultMutableTreeNode topchildnode1, topchildnode2, topchildnode3,toptreenode;
    DrawPanel dp = new DrawPanel();
         public int i=0;
         public int j=0;
         public int flag = 1 ;
         public String var,S,R,D;
    Frame fr = new Frame("GUI TOOL");
    public CompTree()
         File nFile = null ;     
         mainTree = DrawTree(nFile,"N") ;
         mainTree.updateUI();
         mainTree.setBackground(new Color(105,205,159));     
              // Tree is getting added into scroll pane
         treeScrollPane = new JScrollPane(mainTree);
              treeScrollPane.setVerticalScrollBarPolicy(javax.swing.JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
    treeScrollPane.setHorizontalScrollBarPolicy(javax.swing.JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
              splitScrollPane = new JScrollPane();
              splitScrollPane.setViewportView(dp.panel1);          
              splitScrollPane.setVerticalScrollBarPolicy(javax.swing.JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
    splitScrollPane.setHorizontalScrollBarPolicy(javax.swing.JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
    jSplitPane1 = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,treeScrollPane,splitScrollPane);          
         jSplitPane1.setOneTouchExpandable(true);
         jSplitPane1.setContinuousLayout(true);
    jSplitPane1.addComponentListener(new ComponentAdapter(){
              public void componentResized(ComponentEvent e) {      
                   System.out.println("Componenet resized");
              flag = 1;
              paint(dp.panel1.getGraphics());          
    //Provide minimum sizes for the two components in the split pane
    Dimension minimumSize = new Dimension(150,75);
              splitScrollPane.setMinimumSize(minimumSize);
    //Provide a preferred size for the split pane
    jSplitPane1.setPreferredSize(new Dimension(700, 500));
              //setContentPane(jSplitPane1);
              fr.add(jSplitPane1);
              fr.setSize(700,500);
              fr.setVisible(true);          
              fr.addWindowListener(this);     
    public void windowActivated(WindowEvent we){
         System.out.println("activated");
         dp.draw();
    public void windowClosed(WindowEvent we){System.out.println("closed");}
    public void windowIconified(WindowEvent we){System.out.println("iconified");}
    public void windowDeiconified(WindowEvent we){
         dp.draw();
         System.out.println("deiconified");
    public void windowDeactivated(WindowEvent we){System.out.println("deactivated");}
    public void windowOpened(WindowEvent we){
         dp.repaint();
         System.out.println("opened");
    public void windowClosing(WindowEvent we){
         System.exit(0);
         System.out.println("closing");
         public void valueChanged(TreeSelectionEvent e) {
              DefaultMutableTreeNode node = (DefaultMutableTreeNode)
              mainTree.getLastSelectedPathComponent();     
              String strRootNode = "" ;
              try{
                   Object rootNode = node.getRoot();          
                   strRootNode = rootNode.toString() ;
              catch(Exception eRoot)
                   System.out.println("Error in geting Root Node");
              if (node == null) return;
              Object nodeInfo = node.getUserObject();          
              TreeNode ParentNode = node.getParent();               
              final String strParentName = node.toString() ;
                   if (strParentName.equals("Source"))
              System.out.println("Before source");     
              var = "S";
              System.out.println("This is source");
              else if (strParentName.equals("Redirection"))
    var ="R";
              else if (strParentName.equals("Sink") )
                   var ="D";
              else
                   if ( strRootNode != strParentName){
         public JTree DrawTree( File file, String strIsValid)
                   jtree = new JTree();
                   toptreenode = new DefaultMutableTreeNode("Start");
                   topchildnode1 = new DefaultMutableTreeNode("Source");
                   topchildnode2 = new DefaultMutableTreeNode("Sink");
                   topchildnode3 = new DefaultMutableTreeNode("Redirection");
                   toptreenode.add(topchildnode1);
                   toptreenode.add(topchildnode2);
                   toptreenode.add(topchildnode3);
                   jtree.putClientProperty("JTree.lineStyle", "Angled");
                   DefaultTreeModel defaulttreemodel = new DefaultTreeModel(toptreenode);
                   jtree.setModel(defaulttreemodel);
                   DefaultTreeSelectionModel defaulttreeselectionmodel = new DefaultTreeSelectionModel();
                   defaulttreeselectionmodel.setSelectionMode(1);
                   jtree.setSelectionModel(defaulttreeselectionmodel);
                   jtree.addTreeSelectionListener(this);
                   jtree.setEditable(true);
                   return jtree;      
    public static void main(String args[]){
         CompTree ct = new CompTree();
         * This class contains all the component related to panel 1
         * this can be used for .....
    public class DrawPanel extends JPanel implements ActionListener,
         ComponentListener,MouseListener,KeyListener{
         public JRadioButton uniRadio,multiRadio,show;
         public JButton sBut,rBut,dBut;
         public int flag = 1 ;
         public int Radio = 1;
         public boolean sIndicator = true;
         public boolean rIndicator = true;
         public boolean isDestSelected = false;
         public boolean isDestFirstTime = true;
    public int x1 = 0 ;
         public int y1 = 0 ;
         public int x2 = 0 ;
         public int y2 = 0;
         public int x3 = 0;
         public int y3 = 0;
         public int k=0;
         public int l = 40;
    public int b = 40;     
         public String connection1,connection2,connection3,destination1,destination2;
         public int locX;
         public int locY;
    public JPanel panel1 = new JPanel ();      
    public JPanel panel2 = new JPanel ();     
         Vector lines = new Vector();
         Vector colors = new Vector();
         Vector obj = new Vector();
    Vector source = new Vector();
         Vector loc = new Vector();
         BasicStroke stroke = new BasicStroke(2.0f);
    Icon compImage = new ImageIcon("network1.gif"); //new
    Icon workImage = new ImageIcon("tconnect02.gif");
    Icon lapImage = new ImageIcon("server02.gif");
         public DrawPanel(){
         am adding radio button for checking the mode unicast and broad cast mode -- new
    uniRadio = new JRadioButton("Unicast Mode");
    uniRadio.setMnemonic(KeyEvent.VK_B);
    uniRadio.setSelected(true);
    multiRadio = new JRadioButton("Broadcast Mode");
    multiRadio.setMnemonic(KeyEvent.VK_C);
    show = new JRadioButton("show Panel");
    show.setMnemonic(KeyEvent.VK_C);
         ButtonGroup group = new ButtonGroup();
    group.add(uniRadio);
    group.add(multiRadio);
              group.add(show);
         /*     Border border = ButtonGroup.getBorder();
              Border margin = new EmptyBorder(10,10,10,10);
              ButtonGroup.setBorder(new CompoundBorder(border,margin)); */
              uniRadio.addActionListener(this);
         multiRadio.addActionListener(this);
              show.addActionListener(this);
    panel1.add(uniRadio);
              panel1.add(multiRadio);
              panel1.add(show);
              uniRadio.setBounds(150,15,100,40);
              multiRadio.setBounds(260,15,120,40);
              show.setBounds(390,15,100,40);
              uniRadio.setBackground(new Color(105,200,205));
              multiRadio.setBackground(new Color(105,200,205));
              show.setBackground(new Color(105,200,205));
              /*****************PANEL 1*********************/
              panel1.setLayout(null);
    panel1.setBounds(new Rectangle(0,0,400,400));
              panel1.setBackground(new Color(105,100,205));
              panel1.addComponentListener(this);
              panel1.addMouseListener(this);      
         public void sourceObject(String name)
    sBut = new JButton(compImage);
         panel1.add(sBut);     
         sBut.setMnemonic(KeyEvent.VK_F);
         sBut.setBounds(new Rectangle(locX,locY,l,b));     
         sBut.addActionListener(this);
         sBut.addMouseListener(this);
         sBut.addKeyListener(this);
    System.out.println("am inside the source object") ;
         sBut.setBackground(new Color(105,100,205));
         System.out.println("key number" +sBut.getMnemonic());
         System.out.println("MY LOCATION : SBUT : "+ sBut.getLocation());
         public void redirectionObject(String name)
         rBut = new JButton(workImage);
         panel1.add(rBut);
         rBut.setBounds(new Rectangle(locX,locY,l,b));     
    rBut.addActionListener(this);
         rBut.addMouseListener(this);
         rBut.addKeyListener(this);
         rBut.setBackground(new Color(105,100,205));
    System.out.println("am inside the redirection :" + j) ;
    System.out.println("MY LOCATION : RBUT : "+ rBut.getLocation());          
    public void destinationObject(String name){     
         dBut = new JButton(lapImage);
         panel1.add(dBut);     
         dBut.setBackground(new Color(105,100,205));
    System.out.println("am inside the destination object") ;     
    dBut.setBounds(new Rectangle(locX,locY,l,b));                    
         System.out.println("am inside the destination:" + j) ;
         dBut.addActionListener(this);
         dBut.addMouseListener(this);
         dBut.addKeyListener(this);
         System.out.println("MY LOCATION : DBUT : "+ dBut.getLocation());           
    public void paintComponent(Graphics g){
    super.paintComponent(g);
         System.out.println("inside paint");
         Graphics2D g2 = (Graphics2D) g;
    g2.setStroke(stroke);
    if(flag == 1){
         /* this is for drawing current line, this will be drawn when component event happens */
              g.setColor(getForeground());
    System.out.println("inside flag");
    int np = lines.size();
                        System.out.println("Total number of lines present the buffer to draw :" + np);
                             for (int I=0; I < np; I++) {                       
         Rectangle p = (Rectangle)lines.elementAt(I);
                        g2.setColor((Color)colors.elementAt(I));
                             System.out.println("width" + p.width);
                             g2.setColor(Color.red);
                        //     g2.setPaint(p.x,p.y,p.width,p.height);
                             g2.drawLine(p.x,p.y,p.width,p.height);                         
                             System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
                             System.out.println(obj.elementAt(I));
                             System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
                             System.out.println(p.x +"," +","+ p.y + ","+ ","+ p.width+ "," + ","+ p.height);
    flag = -1;
    }else if(flag == -1){
         if(x1 != 0 && y1 != 0 && x2 != 0 && y2 != 0 ){
    connection1 = "source to redirection";
    g2.setColor(Color.red);
         g2.drawLine(x1,y1,x2,y2);          
         lines.addElement(new Rectangle(x1,y1,x2,y2));
         colors.addElement(getForeground());
         obj.addElement(connection1);
         x1 = 0 ;y1 = 0 ;
         x2 = 0 ;y2 = 0 ;
    else if (x2 != 0 && y2 != 0 && x3 != 0 && y3 != 0 )
              connection2 = "Redirection to Destination";
              g2.setColor(Color.green);
                   g2.drawLine(x2,y2,x3,y3);                    
    colors.addElement(getForeground());
                   lines.addElement(new Rectangle(x2,y2,x3,y3));               
                   obj.addElement(connection2);
                   x2 = 0; y2 = 0 ;
                   x3 = 0 ; y3 = 0 ;                    
    else if (x1 != 0 && y1 != 0 && x3 != 0 && y3 != 0)
                   connection3 = "Source to Destination";
                   g2.setColor(Color.red);
                   g2.drawLine(x1,y1,x3,y3);                    
    colors.addElement(getForeground());
                   lines.addElement(new Rectangle(x1,y1,x3,y3));                              
                   obj.addElement(connection3);
                        x1 = 0; y1 = 0 ;
                        x3 = 0 ; y3 = 0 ;                    
                        /*     Image offscreen = panel1.createImage(400,400);
              Graphics og = offscreen.getGraphics();
         og.drawLine(200,200,500,500);
              g.drawImage(offscreen,0,0,null); */
    // Component Listener's method
    public void componentHidden(ComponentEvent e) { 
    if(e.getSource().equals(panel1)){System.out.println("Componenet Hidden");}
              System.out.println("Componenet Hidden");
    public void componentMoved(ComponentEvent e) {
              System.out.println("Componenet moved");
              draw();
    public void componentResized(ComponentEvent e) {      
              System.out.println("Componenet resized");
              flag = 1;
              paintComponent(panel1.getGraphics());
    public void componentShown(ComponentEvent e) {     
              System.out.println("Componenet Shown");
    // Mouse Listerner's Method
         public void mouseClicked(MouseEvent me){
    if (me.getSource().equals(panel1))
              System.out.println("inside mouse clicked");
                        if(var == "S"){
    the boolean sIndicator will allow the usage of source object only once
         This is the case for both unicast and multi cast.It has been restricted
         to single use.
                             if (sIndicator){
                             System.out.println("inside mouse clicked");
                        System.out.println("locX" + locX);
                        locX = me.getX();
    locY = me.getY();
                   sourceObject("Source");
                             sIndicator = false;
                        }else{}
              }else if (var == "R")
    if(rIndicator){
    if(!isDestSelected){
    System.out.println("redirection" + locX);
    locX = me.getX();
    locY = me.getY();
                   redirectionObject("Redirection");
                   rIndicator = false;
                   }else{}
    } else{}
              }else if(var == "D"){
              if(Radio == 1 && isDestSelected == false){
              System.out.println("Destination -- uni cast mode" + locX);
    locX = me.getX();
    locY = me.getY();
                   destinationObject("Sink");
              isDestSelected = true;
              } else if (Radio == 2)
                                  System.out.println("Destination -- Multicast mode" + locX);
                                  locX = me.getX();
                                  locY = me.getY();
                                  destinationObject("Sink");
                                  isDestSelected = true;                    
         public void mousePressed(MouseEvent me){System.out.println("am inside mouse pressed"); }
         public void mouseReleased(MouseEvent me){
              System.out.println("am inside mouse released");
              paintComponent(panel1.getGraphics());
         public void mouseEntered(MouseEvent me){}
         public void mouseExited(MouseEvent me){}
    // key Listener
    public void keyReleased(KeyEvent e) {        
                        Component compo =(JButton)e.getSource();                               
                             if (e.getKeyChar() == e.VK_DELETE){                         
                             remove(compo);
              public void keyTyped(KeyEvent e) {}
              public void keyPressed(KeyEvent e){}
    public void remove(Component comp){          
    System.out.println("inside delete key" );                         
         panel1.remove(comp);
         panel1.repaint();     
         public void draw(){
              super.paint(panel1.getGraphics());
              System.out.println("inside draw");
              flag = 1;
              paintComponent(panel1.getGraphics());     
         public void actionPerformed(ActionEvent e)
                             if(e.getSource().equals(sBut)){
                                  System.out.println("am s button");                
                                  x1 = sBut.getX() + l;
                                  y1 = sBut.getY() + (b/2);
                             else if(e.getSource().equals(rBut)){
                                  System.out.println("am r button");               
                                  x2 = rBut.getX() ;
                                  y2 = rBut.getY()+ b/2;
                                  System.out.println("x2 : " + x2 + "y2 :" +y2 );
                             else if(e.getSource().equals(dBut)){
                                  System.out.println("am d button");                
                                  x3 = dBut.getX();
                                  y3 = dBut.getY()+ b/2;
                             else if (e.getSource().equals(uniRadio)){
                                  System.out.println("uni radio");
                                  Radio = 1 ;
                             } else if (e.getSource().equals(multiRadio)){
                                       System.out.println("multi radio");
                                       Radio = 2;
                             } else if (e.getSource().equals(show)){            
                                  System.out.println("inside show");
    *********************************************

    ok
    i don't take a long time tracing your code, but i think u have to overwrite the repaint methode so it 's call the methode which will paint the line each time.
    hope this will help!

  • Double buffering images

    HELP!!! lol i'm trying to figure out how to get the whole double buffering thing to work with a picture like a gif image i drew in paint. i can't quite understand anything aobut how to do it. lol i've read some things and looked at some code samples but they all do it with a polygon. i just can't seem to get it right. i learn best from code snipets if that helps. don't give me a whole program i just want some lines that will help me learn it like what i have to import. and other things. i know a little about using images but not a whole lot. if anyone can help it will be appreciated.
    andy

    Psst... Tell you teacher that one can read an image with ImageIO, often in one line:
    BufferedImage image = ImageIO.read(file_or_url_or_inputstream);(No need for a MediaTracker!) And the resulting BufferedImage (a subclass of Image)
    is easier to work with than Image and has more useful features.
    Welcome to Java 2D.

  • Printing JTable after turning off double buffering causing repaint problems

    I've followed all the instructions to speed up a print job in java by turning off double buffering temporarily by using the following call before calling paint() on the component...
    RepaintManager.currentManager(printTable).setDoubleBufferingEnabled(false);
    ... and then turning it back on afterwards...
    RepaintManager.currentManager(printTable).setDoubleBufferingEnabled(true);
    but the problem is that if it is a long print job, then the rest of the application (including other JTables) isn't repainting properly at all. I have the printing going on in a separate thread since I don't think it's acceptable UI practices to force the user to wait until a print job finishes before they can proceed with using their application. I've tried controlling the double buffering at the JPanel level as well, but it always affects the entire application until the print spooling is complete.
    Does anyone have any suggestions to solve this annoying SWING printing problem?
    Thanks,
    - Tony

    When you post code, make sure and put it between code
    tags, so it looks good:
    public static void main(String[] args) {
    System.out.println("Doesn't this look great?");
        public int print(Graphics g, PageFormat pf, int pageIndex) {
            System.out.println( "Calling print(g,pf,pageIndex) method" );
            int response = NO_SUCH_PAGE;
            Graphics2D g2 = (Graphics2D) g;
    // for faster printing, turn off double buffering
            disableDoubleBuffering(componentToBePrinted);
            Dimension d = componentToBePrinted.getSize(); //get size of document
            double panelWidth = d.width; //width in pixels
            double panelHeight = d.height; //height in pixels
            double pageHeight = pf.getImageableHeight(); //height of printer page
            double pageWidth = pf.getImageableWidth(); //width of printer page
            double scale = pageWidth / panelWidth;
            int totalNumPages = (int) Math.ceil(scale * panelHeight / pageHeight);
    // make sure not print empty pages
            if (pageIndex >= totalNumPages) {
                response = NO_SUCH_PAGE;
            } else {
    // shift Graphic to line up with beginning of print-imageable region
                g2.translate(pf.getImageableX(), pf.getImageableY());
    // shift Graphic to line up with beginning of next page to print
                g2.translate(0f, -pageIndex * pageHeight);
    // scale the page so the width fits...
                g2.scale(scale, scale);
                componentToBePrinted.paint(g2); //repaint the page for printing
                enableDoubleBuffering(componentToBePrinted);
                response = Printable.PAGE_EXISTS;
            return response;
        }

  • Double Buffering a large image - is it a good idea to do so ?

    I'm developing a small maze like game. I'm using double buffering. So I double buffer the enter screen area (1024x768) and copy them all back to the on screen buffer...
    I need my code to run atleast at 18 - 24 fps.
    Is there a better/efficient way to do this...
    Note : I'm manually double buffer. I don't use any Buffer manager.
    like this
    public void update(Graphics g)
          Image i = createImage(...)      ;
          paint(i.getGraphics() );
          g.drawImage(i..)
    }

    Hi chaos,
    I am developing a game too and I achieve very high frame rate (up to 60 fps) using the hardware accelerated pipelines and the double buffering/page flipping strategy.
    here is the method I call to update my the entire screen of my game:
    private void screenUpdate()
        try
          Graphics gScr = bufferStrategy.getDrawGraphics();
          gameRender(gScr); //this is where I paint the game screen
          gScr.dispose();
          if (!bufferStrategy.contentsLost())
            bufferStrategy.show();
        } catch (Exception e)
          e.printStackTrace();
          running = false;
      }Here is how I create the buffer strategy in the main JFrame:
    try
          EventQueue.invokeAndWait(new Runnable()
            public void run()
              createBufferStrategy(NUM_BUFFERS);
        } catch (Exception e)
          System.out.println("Error while creating buffer strategy");
          System.exit(0);
        bufferStrategy = getBufferStrategy();In my gameRender method, I use only draming method that works without breaking the hardware acceleration (by default enabled with java 6.0). I just make sure to use BufferedImage without rotation or manually written filters and the game runs at 60 fps without any issue.
    The CPU is even still sleeping more than 70% of the time which gives a lot room for all other processing such as path finders, A.I., ...
    Cheers.
    Vince.

  • Double Buffering Problem in html

    My double buffering works in my IDE, but not when embedded in html.
    import javax.swing.*;
    import java.applet.*;
    import java.awt.event.*;
    import java.awt.*;
    import java.awt.image.*;
    import java.util.*;
    class Brick
        public int x,y;   
        public Brick(int x,int y) {this.x = x;this.y = y;}
    class Ball
        public int x,y,a,b;
        public Ball(int x, int y) {this.x = x;this.y = y;}
    public class Pong2 extends JApplet implements MouseListener, MouseMotionListener, Runnable, KeyListener
        long tm = System.currentTimeMillis();
        int delay;
        int a1=0,b1=0,c1=0,d1=0;
        int dead;
        int ranB1,ranB2;
        boolean pauseB = false;
        boolean starttext = true;
        int ani = 0;
        String stringWin;
        Graphics offscreen;Image image;
        private final int INIT_ACTIVE = 0;
        private final int INTRO_ACTIVE = 1;
        private final int GAME1_ACTIVE = 2;
        private final int GAME2_ACTIVE = 3;
        private final int GAME3_ACTIVE = 4;
        private int r1,r2,r3,r4,r5,starter=0,win=0,own=0;
        private int gameflag;
        private boolean player = true,moveB = true,thisB = true,timerB = true;
        private boolean drawB = true;
        private int counte=0;
        private int time = -2;
        private int movecheck1; int movecheck2;int movecheck3;int movecheck4;
        private int c;
        private int god = 0;
        private int tempx1, tempy1,tempx2,tempy2;
        private int pause = 2, resume = 0;
        private int ran, ran2,ran3,ran4;
        private int yCheck1,yCheck2,yCheck3,yCheck4,xCheck1,xCheck2,xCheck3,xCheck4;
        private int begin = 0;
        private int counter = 0, colorChange =0;
        private Brick brick[] = new Brick[4];
        private Ball ball[] = new Ball[2];
        private Ball ball2[] = new Ball[8];
        private int cons1 = 0,cons2 = 0,cons3=0,cons4=0;
        private int score1=10, score2=10,score3=10,score4=10;
        private Thread t;
        private Font font;
        private AudioClip match,teleport,headshot, ballbounce, dkill,humiliation,one,two,three,fight,prepare;   
        public Image paddle3,paddle4,rarrow,dbuffer,paddle,paddle2,bricks,blood,title,edge,m_imgOffScr;
        private Graphics dbuffer_gfx,m_gOffScr,dbg;
        private Color Color1 = new Color(255,255,255);
        private Color sColor3 = new Color(139,80,14);
        private Color sColor2 = new Color(0,255,0);
        private Color sColor4 = new Color(255,255,0);
        private Polygon poly1 = new Polygon();Polygon poly2 = new Polygon(); 
        private Polygon poly3 = new Polygon();Polygon poly4 = new Polygon();
        private boolean p1Dead=false, p2Dead=false, p3Dead=false, p4Dead=false;
        private int ranLoc, winner;
        public void initgame()
            poly1.addPoint(0,0);poly1.addPoint(0,125);poly1.addPoint(125,0);
            poly2.addPoint(0,650);poly2.addPoint(125,650);poly2.addPoint(0,525);
            poly3.addPoint(650,0);poly3.addPoint(650,125);poly3.addPoint(525,0);
            poly4.addPoint(650,650);poly4.addPoint(650,525);poly4.addPoint(525,650);
            for (int j = 0; j < ball.length; j++){ball[j] = new Ball(325,325);}
            brick[0] = new Brick(25,285);
            brick[1] = new Brick(615,285);
            brick[2] = new Brick(285,25);
            brick[3] = new Brick(285,615);
            yCheck1 = brick[0].y; yCheck2 = brick[1].y; yCheck3 = brick[2].y; yCheck4 = brick[3].y;
            xCheck1 = brick[0].x; xCheck2 = brick[1].x; xCheck3 = brick[2].x; xCheck4 = brick[3].x;
            if(player)
            for (int n = 0; n<8; n++)
                r1 = (int)(Math.random() * 600)+10;r2 = (int)(Math.random() * 600)+10;
                ball2[n] = new Ball(r1,r2);
                if (n == 0||n==4) {ball2[n].a = 3; ball2[n].b = 3;}if (n == 1||n==5) {ball2[n].a = -3; ball2[n].b = 3;}
                if (n == 2||n==6) {ball2[n].a = 3; ball2[n].b = -3;}if (n == 3||n==7) {ball2[n].a = -3; ball2[n].b = -3;}           
            player = false;
        public void init()
            gameflag = INIT_ACTIVE;
            setSize(650,725);
            requestFocus();      
            Font font = new Font ("Arial", Font.BOLD,50);
            paddle = getImage(getCodeBase(), "paddle.jpg");
            paddle2 = getImage(getCodeBase(), "paddle2.jpg");
            paddle3 = getImage(getCodeBase(), "paddle3.jpg");
            paddle4 = getImage(getCodeBase(), "paddle4.jpg");
            bricks = getImage(getCodeBase(), "bricks.jpg");
            blood = getImage(getCodeBase(), "blood.jpg");
            title = getImage(getCodeBase(), "title.jpg"); 
            headshot = getAudioClip(getCodeBase(), "headshot2.wav");
            ballbounce = getAudioClip(getCodeBase(), "ir_begin.wav");
            humiliation = getAudioClip(getCodeBase(), "humiliation.wav");
            prepare = getAudioClip(getCodeBase(), "prepare.wav");
            teleport = getAudioClip(getCodeBase(), "teleport.wav");
            match = getAudioClip(getCodeBase(), "matchwin.wav");
            dbuffer=createImage(getSize().width,getSize().height);
            dbuffer_gfx=dbuffer.getGraphics();
            initgame();
            addMouseListener(this);
            addMouseMotionListener(this);
            addKeyListener(this);
        public void start()
            Thread t = new Thread(this);
            t.start();
            new Thread(pMovement).start();                       
        public void stop()
            t.yield();
            t = null;
        public void update (Graphics g)
            paint(dbuffer_gfx);
            g.drawImage(dbuffer,0,0,this);
        public void PaintIntro(Graphics g)
            g.setColor(Color.white);
            g.fillRect(0,0,650,725);
            g.setColor(Color.black);
            for(int wa = 0;wa<8;wa++)
            g.fillOval(ball2[wa].x,ball2[wa].y,10,10);
            g.drawImage(title,100,100,this);
            g.setFont(new Font("Arial", Font.BOLD,20));
            g.drawString("Written By Alec Parenzan",200,200);
            g.setFont(new Font("Arial", Font.BOLD,14));
            if (colorChange==0)g.setColor(Color.blue);
            g.drawString("4 Player Game",275,430);
            g.setColor(Color.black);
            if (colorChange==1)g.setColor(Color.blue);
            g.drawString("2 Player Game",275,450);
            g.setColor(Color.black);
            if (colorChange==2)g.setColor(Color.blue);
            g.drawString("1 Player Game",275,470);
        public void PaintGame1 (Graphics g)
            g.setColor(Color.black);
            g.drawImage(blood,0,0,650,650,this);
            if(p1Dead==false && own>0 )g.drawImage(paddle3,brick[0].x,brick[0].y,10,80,this);
            if(p2Dead==false&& own>0)g.drawImage(paddle,brick[1].x,brick[1].y,10,80,this);
            if(p3Dead==false&& own>0)g.drawImage(paddle2,brick[2].x,brick[2].y,80,10,this);
            if(p4Dead==false&& own>0)g.drawImage(paddle4,brick[3].x,brick[3].y,80,10,this);
            g.fillPolygon(poly1);g.fillPolygon(poly2);g.fillPolygon(poly3);g.fillPolygon(poly4);
            g.setColor(Color.white);
            g.drawPolygon(poly1);g.drawPolygon(poly2);g.drawPolygon(poly3);g.drawPolygon(poly4);
            g.setColor(Color.black);
            if(begin==1 && drawB)
            {g.fillOval(ball[0].x,ball[0].y,10,10);g.fillOval(ball[1].x,ball[1].y,10,10);}
            g.drawImage(bricks,1,650,650,75,this);
            //score
            g.setFont(new Font("Comic Sans MS", Font.ITALIC,50));
            if(own>0){
                g.setColor(sColor2);g.drawString(Integer.toString(score1),50,705);
                g.setColor(Color.orange);g.drawString(Integer.toString(score2),150,705);
                g.setColor(Color.blue);g.drawString(Integer.toString(score3),440,705);
                g.setColor(sColor3);g.drawString(Integer.toString(score4),540,705);}
            //painting gui
            if (starttext) {g.setColor(Color.black);
                g.setFont(new Font("Arial", Font.ITALIC,30));g.drawString("Click START to Begin",175,325);}
            g.setColor(Color1);
            g.setFont(new Font("Arial", Font.BOLD,30));
            if(pause ==1 && begin>0)g.drawString("RESUME",270,700);
            else if(begin==0)g.drawString("START",270,700);
            else if(begin>=1 && begin<=2 && pause==0){g.drawString("PAUSE",270,700);}    
            //start
            g.setFont(font);g.setColor(Color.black);
            if(win ==1){if(winner==1)g.setColor(Color.green);else if(winner==2)g.setColor(Color.orange);
                else if(winner==3)g.setColor(Color.blue);else if(winner==4)g.setColor(sColor3);           
                g.drawString(stringWin,245,325);}
            g.setColor(Color.black);
            if (time == 1)g.drawString("3",300,325);
            else if (time==2)g.drawString("2",300,325);
            else if (time==3)g.drawString("1",300,325);          
        public void PaintGame2(Graphics g)
            g.setColor(Color.black);
            g.drawImage(blood,0,0,650,650,this);
            if(p1Dead==false && own>0 )g.drawImage(paddle3,brick[0].x,brick[0].y,10,80,this);
            if(p2Dead==false&& own>0)g.drawImage(paddle,brick[1].x,brick[1].y,10,80,this);
            g.fillPolygon(poly1);g.fillPolygon(poly2);g.fillPolygon(poly3);g.fillPolygon(poly4);
            g.setColor(Color.white);
            g.drawPolygon(poly1);g.drawPolygon(poly2);g.drawPolygon(poly3);g.drawPolygon(poly4);
            g.setColor(Color.black);
            if(begin==1 && drawB)
            {g.fillOval(ball[0].x,ball[0].y,10,10);g.fillOval(ball[1].x,ball[1].y,10,10);}
            g.drawImage(bricks,1,650,650,75,this);
            //score
            g.setFont(new Font("Comic Sans MS", Font.ITALIC,50));
            if(own>0){
                g.setColor(sColor2);g.drawString(Integer.toString(score1),50,705);
                g.setColor(Color.orange);g.drawString(Integer.toString(score2),540,705);}
            //painting gui
            if (starttext) {g.setColor(Color.black);
                g.setFont(new Font("Arial", Font.ITALIC,30));g.drawString("Click START to Begin",175,325);}
            g.setColor(Color1);
            g.setFont(new Font("Arial", Font.BOLD,30));
            if(pause ==1 && begin>0)g.drawString("RESUME",270,700);
            else if(begin==0)g.drawString("START",270,700);
            else if(begin>=1 && begin<=2 && pause==0){g.drawString("PAUSE",270,700);}    
            //start
            g.setFont(font);g.setColor(Color.black);
            if(win ==1){if(winner==1)g.setColor(Color.green);else if(winner==2)g.setColor(Color.orange);}
            g.setColor(Color.black);
            if (time == 1)g.drawString("3",300,325);
            else if (time==2)g.drawString("2",300,325);
            else if (time==3)g.drawString("1",300,325);     
        //paint graphics
        public void paint(Graphics g)
                g.setColor(Color.WHITE);
                g.fillRect(0,0,500,500);
                g.setColor(Color.BLACK);
            if (gameflag == INIT_ACTIVE)
                g.setColor(Color.black);
                g.fillRect(0,0,getSize().width,getSize().height);
                g.setColor(Color.white);
                g.drawString("Loading...",getSize().width/2, getSize().height/2);
            if (gameflag == INTRO_ACTIVE){PaintIntro(g);}
            if (gameflag == GAME1_ACTIVE){PaintGame1(g);} 
            if (gameflag == GAME2_ACTIVE || gameflag == GAME3_ACTIVE){PaintGame2(g);}
        public void paddlephys()
            for(int j =0; j < 2;j++)
                //P1
                if(p1Dead==false&&ball[j].x-4<=xCheck1 && ball[j].x<=xCheck2 && begin==1)
                    if (ball[j].y>=yCheck1&&ball[j].y<=yCheck1+12) {ball[j].a=2;ball[j].b=-4;ballbounce.play();}
                    else if (ball[j].y>=yCheck1+13&&ball[j].y<=yCheck1+25) {ball[j].a=3;ball[j].b=-3;ballbounce.play();}
                    else if (ball[j].y>=yCheck1+26&&ball[j].y<=yCheck1+39) {ball[j].a=4;ball[j].b=-2;ballbounce.play();}
                    else if (ball[j].y>=yCheck1+40&&ball[j].y<=yCheck1+53) {ball[j].a=4;ball[j].b=2;ballbounce.play();}
                    else if (ball[j].y>=yCheck1+54&&ball[j].y<=yCheck1+66) {ball[j].a=3;ball[j].b=3;ballbounce.play();}
                    else if (ball[j].y>=yCheck1+67&&ball[j].y<=yCheck1+79) {ball[j].a=2;ball[j].b=4;ballbounce.play();}
                //P2
                if(p2Dead==false&&ball[j].x>=xCheck2 && ball[j].x<=xCheck2+5 && begin==1)
                    if (ball[j].y>=yCheck2&&ball[j].y<=yCheck2+12) {ball[j].a=-2;ball[j].b=-4;ballbounce.play();}
                    else if (ball[j].y>=yCheck2+13&&ball[j].y<=yCheck2+25) {ball[j].a=-3;ball[j].b=-3;ballbounce.play();}
                    else if (ball[j].y>=yCheck2+26&&ball[j].y<=yCheck2+39) {ball[j].a=-4;ball[j].b=-2;ballbounce.play();}
                    else if (ball[j].y>=yCheck2+40&&ball[j].y<=yCheck2+53) {ball[j].a=-4;ball[j].b=2;ballbounce.play();}
                    else if (ball[j].y>=yCheck2+54&&ball[j].y<=yCheck2+66) {ball[j].a=-3;ball[j].b=3;ballbounce.play();}
                    else if (ball[j].y>=yCheck2+67&&ball[j].y<=yCheck2+79) {ball[j].a=-2;ball[j].b=4;ballbounce.play();}
                //P3
                if(p3Dead==false&&ball[j].y>=yCheck3-5 && ball[j].y<=yCheck3 && begin==1)
                    if (ball[j].x>=xCheck3&&ball[j].x<=xCheck3+12) {ball[j].a=-4;ball[j].b=2;ballbounce.play();}
                    else if (ball[j].x>=xCheck3+13&&ball[j].x<=xCheck3+25) {ball[j].a=-3;ball[j].b=3;ballbounce.play();}
                    else if (ball[j].x>=xCheck3+26&&ball[j].x<=xCheck3+39) {ball[j].a=-2;ball[j].b=4;ballbounce.play();}
                    else if (ball[j].x>=xCheck3+40&&ball[j].x<=xCheck3+53) {ball[j].a=2;ball[j].b=4;ballbounce.play();}
                    else if (ball[j].x>=xCheck3+54&&ball[j].x<=xCheck3+66) {ball[j].a=3;ball[j].b=3;ballbounce.play();}
                    else if (ball[j].x>=xCheck3+67&&ball[j].x<=xCheck3+79) {ball[j].a=4;ball[j].b=2;ballbounce.play();}
                //P4
                if(p4Dead==false&&ball[j].y>=yCheck4 && ball[j].y<=yCheck4+5 && begin==1)
                    if (ball[j].x>=xCheck4&&ball[j].x<=xCheck4+12) {ball[j].a=-4;ball[j].b=-2;ballbounce.play();}
                    else if (ball[j].x>=xCheck4+13&&ball[j].x<=xCheck4+25) {ball[j].a=-3;ball[j].b=-3;ballbounce.play();}
                    else if (ball[j].x>=xCheck4+26&&ball[j].x<=xCheck4+39) {ball[j].a=-2;ball[j].b=-4;ballbounce.play();}
                    else if (ball[j].x>=xCheck4+40&&ball[j].x<=xCheck4+53) {ball[j].a=2;ball[j].b=-4;ballbounce.play();}
                    else if (ball[j].x>=xCheck4+54&&ball[j].x<=xCheck4+66) {ball[j].a=3;ball[j].b=-3;ballbounce.play();}
                    else if (ball[j].x>=xCheck4+67&&ball[j].x<=xCheck4+79) {ball[j].a=4;ball[j].b=-2;ballbounce.play();}
         Runnable pMovement = new Runnable()
             public void run()
                 while(moveB)
                     if(pauseB==false){
                     if (brick[0].y == 445) brick[0].y-=2; if (brick[0].y == 125) brick[0].y+=2;
                     if (brick[0].y<445&&brick[0].y>125){if (movecheck1==1){brick[0].y-=1;yCheck1 = brick[0].y;} 
                     else if (movecheck1==-1){brick[0].y+=1;yCheck1 = brick[0].y;} }
                     if (brick[1].y == 445) brick[1].y-=2; if (brick[1].y == 125) brick[1].y+=2;   
                     if (brick[1].y<445&&brick[1].y>125){if (movecheck2==1){brick[1].y-=1;yCheck2 = brick[1].y;}
                     else if (movecheck2==-1){brick[1].y+=1;yCheck2 = brick[1].y;}  }
                     if (brick[2].x == 445) brick[2].x-=2; if (brick[2].x == 125) brick[2].x+=2;   
                     if (brick[2].x<570&&brick[2].x>125){if (movecheck3==1){brick[2].x-=1;xCheck3 = brick[2].x;}
                     else if (movecheck3==-1){brick[2].x+=1;xCheck3 = brick[2].x;}  }
                     if (brick[3].x == 445) brick[3].x-=2; if (brick[3].x == 125) brick[3].x+=2;   
                     if (brick[3].x<570&&brick[3].x>0){if (movecheck4==1){brick[3].x-=1;xCheck4 = brick[3].x;}
                     else if (movecheck4==-1){brick[3].x+=1;xCheck4 = brick[3].x;}  }
                     starter();
                     try{Thread.sleep(2,500);}catch(InterruptedException e){}              
                if(pauseB){try{Thread.sleep(2,500);}catch(InterruptedException e){}}
        public void starter()
            if(starter==1)
                if(gameflag==2){p1Dead=false; p2Dead=false; p3Dead=false; p4Dead=false;}
                if(gameflag==3 || gameflag==4){p3Dead=true;p4Dead=true;}
                a1=0;b1=0;c1=0;d1=0;drawB=true;
                starttext = false;
                win=0;
                score1=10;score2=10;score3=10;score4=10;
                if(gameflag==3 || gameflag==4){score3=0;score4=0;}       
                own=1;
                prepare.play();
                try{Thread.sleep(5000);}catch(InterruptedException e){}
                time=1;
                try{Thread.sleep(1000);}catch(InterruptedException e){}
                time=2;
                try{Thread.sleep(1000);}catch(InterruptedException e){}
                time=3;
                try{Thread.sleep(1000);}catch(InterruptedException e){}
                if(gameflag==2)
                    ball[0].a=2;ball[0].b=0;
                    ball[1].a=0;ball[1].b=-2;
                if(gameflag==3 || gameflag==4)
                    ball[0].a=2;ball[0].b=0;
                    ball[1].a=-2;ball[1].b=0;
                ball[0].x = 325; ball[0].y = 325;ball[1].x = 325; ball[1].y = 325;
                pause=0;time=-5;starter=0;begin=1;
        public void run()
            while(thisB)
                if(pauseB==false)
                switch(gameflag)
                    case INIT_ACTIVE:
                        repaint();
                        gameflag = INTRO_ACTIVE;
                        try{Thread.sleep(10);}
                        catch(InterruptedException ex){break;}
                        break;
                    case INTRO_ACTIVE:             
                        physicsintro();
                        try{Thread.sleep(10);}
                        catch(InterruptedException ex){break;}
                        for(int w = 0;w<8;w++){ball2[w].x+=ball2[w].a;ball2[w].y+=ball2[w].b;}
                        repaint();
                        break;
                    case GAME1_ACTIVE:
                        if(countDead())resetter();
                        boundaries();
                        paddlephys();
                        for(int w = 0;w<2;w++){ball[w].x+=ball[w].a;ball[w].y+=ball[w].b;}                  
                        try{Thread.sleep(7,500);}catch(InterruptedException e){break;}     
                        repaint();  
                    case GAME2_ACTIVE:
                        if(countDead())resetter();
                        boundaries();
                        paddlephys();
                        for(int w = 0;w<2;w++){ball[w].x+=ball[w].a;ball[w].y+=ball[w].b;}                  
                        try{Thread.sleep(7,500);}catch(InterruptedException e){break;}     
                        repaint();  
                    case GAME3_ACTIVE:
                        if(countDead())resetter();
                        boundaries();
                        paddlephys();
                        for(int w = 0;w<2;w++){ball[w].x+=ball[w].a;ball[w].y+=ball[w].b;}                  
                        try{Thread.sleep(7,500);}catch(InterruptedException e){break;}     
                        repaint();  
                if(pauseB==true){repaint();try{Thread.sleep(7,500);}catch(InterruptedException e){}}
        public void boundaries()
            for(int z = 0; z<2;z++)
                ranB1 = (int)(Math.random() * 4);
                //P1 scores
                if(p1Dead==false && ball[z].y<525 && ball[z].y>125 && ball[z].x<2)
                    if(score1==1)humiliation.play();
                    else headshot.play();               
                    score1--;cons1++;              
                    ball[z].y=325;ball[z].x=325;
                    if(ranB1==0){ball[z].a=1;ball[z].b=1;}else if(ranB1==1){ball[z].a=-1;ball[z].b=1;}
                    else if(ranB1==2){ball[z].a=1;ball[z].b=-1;}else if(ranB1==3){ball[z].a=-1;ball[z].b=-1;}               
                    if(score1 == 0)p1Dead=true;                                                        
                //P2 scores
                else if(p2Dead==false&& ball[z].y<525 && ball[z].y>125 && ball[z].x>648)
                    if(score2==1)humiliation.play();
                    else headshot.play();
                    score2--;cons2++;     
                    ball[z].y = 325;ball[z].x=325;
                    if(ranB1==0){ball[z].a=1;ball[z].b=1;}else if(ranB1==1){ball[z].a=-1;ball[z].b=1;}
                    else if(ranB1==2){ball[z].a=1;ball[z].b=-1;}else if(ranB1==3){ball[z].a=-1;ball[z].b=-1;}
                    if(score2 == 0)p2Dead=true;
                //P3 scores
                else if(p3Dead==false&&ball[z].x<525 && ball[z].x>125 && ball[z].y<2)
                    if(score3==1)humiliation.play();
                    else headshot.play();               
                    score3--;cons3++;          
                    ball[z].y = 325; ball[z].x = 325;
                    if(ranB1==0){ball[z].a=1;ball[z].b=1;}else if(ranB1==1){ball[z].a=-1;ball[z].b=1;}
                    else if(ranB1==2){ball[z].a=1;ball[z].b=-1;}else if(ranB1==3){ball[z].a=-1;ball[z].b=-1;}
                    if(score3 == 0)p3Dead=true;
                //P4 Scores
                else if(p4Dead==false&&ball[z].x<525 && ball[z].x>125 && ball[z].y>648)
                    if(score4==1)humiliation.play();
                    else headshot.play();
                    score4--;cons4++;            
                    ball[z].y = 325; ball[z].x = 325;
                    if(ranB1==0){ball[z].a=1;ball[z].b=1;}else if(ranB1==1){ball[z].a=-1;ball[z].b=1;}
                    else if(ranB1==2){ball[z].a=1;ball[z].b=-1;}else if(ranB1==3){ball[z].a=-1;ball[z].b=-1;}
                    if(score4 == 0)p4Dead=true;
                if((p1Dead==true && ball[z].y<525 && ball[z].y>125 && ball[z].x<2) || (gameflag==3 || gameflag == 4))
                    ballbounce.play();ball[z].a*=-1;
                else if((p2Dead==true && ball[z].y<525 && ball[z].y>125 && ball[z].x>648) || (gameflag==3 || gameflag == 4))
                    ballbounce.play();ball[z].a*=-1;
                else if((p3Dead==true &&ball[z].x<525 && ball[z].x>125 && ball[z].y<2) || (gameflag==3 || gameflag == 4))
                    ballbounce.play();ball[z].b*=-1;
                else if((p4Dead==true &&ball[z].x<525 && ball[z].x>125 && ball[z].y>648) || (gameflag==3 || gameflag == 4))
                    ballbounce.play();ball[z].b*=-1;
                if(poly1.contains(ball[z].x,ball[z].y))
                    ballbounce.play();
                    if(ranB1 == 0){ball[z].a=1;ball[z].b=5;}else if(ranB1 == 1){ball[z].a=2;ball[z].b=4;}
                    else if(ranB1 == 2){ball[z].a=5;ball[z].b=1;}else if(ranB1 == 3){ball[z].a=4;ball[z].b=2;}
                else if(poly2.contains(ball[z].x,ball[z].y))
                    ballbounce.play();
                    if(ranB1 == 0){ball[z].a=1;ball[z].b=-5;}else if(ranB1 == 1){ball[z].a=2;ball[z].b=-4;}
                    else if(ranB1 == 2){ball[z].a=5;ball[z].b=-1;}else if(ranB1 == 3){ball[z].a=4;ball[z].b=-2;}
                else if(poly3.contains(ball[z].x,ball[z].y))
                    ballbounce.play();
                    if(ranB1 == 0){ball[z].a=-1;ball[z].b=5;}else if(ranB1 == 1){ball[z].a=-2;ball[z].b=4;}
                    else if(ranB1 == 2){ball[z].a=-5;ball[z].b=1;}else if(ranB1 == 3){ball[z].a=-4;ball[z].b=2;}
                else if(poly4.contains(ball[z].x,ball[z].y))
                    ballbounce.play();
                    if(ranB1 == 0){ball[z].a=-1;ball[z].b=-5;}else if(ranB1 == 1){ball[z].a=-2;ball[z].b=-4;}
                    else if(ranB1 == 2){ball[z].a=-5;ball[z].b=-1;}else if(ranB1 == 3){ball[z].a=-4;ball[z].b=-2;}
        public void resetter()
            brick[0].x=25;brick[0].y=285;brick[1].x=615;brick[1].y=285;brick[2].x=285;brick[2].y=25;brick[3].x=285;brick[3].y=615;
            if(p4Dead==true && p3Dead==true && p2Dead==true && p1Dead==false){ball[0].x = 325;ball[0].y = 325;ball[1].x = 325;ball[1].y = 325;
                ball[0].a=0;ball[0].b=0;ball[1].a=0;ball[1].b=0;drawB=false;match.play();pause=5;p1Dead=true;begin=0;win=1;winner=1;stringWin="Player 1 Wins";}
            else if(p4Dead==true && p3Dead==true && p2Dead==false && p1Dead==true){ball[0].x = 325;ball[0].y = 325;ball[1].x = 325;ball[1].y = 325;
                ball[0].a=0;ball[0].b=0;ball[1].a=0;ball[1].b=0;drawB=false;match.play();pause=5;p2Dead=true;begin=0;win=1;winner=2;stringWin="Player 2 Wins";}
            else if(p4Dead==true && p3Dead==false && p2Dead==true && p1Dead==true){ball[0].x = 325;ball[0].y = 325;ball[1].x = 325;ball[1].y = 325;
                ball[0].a=0;ball[0].b=0;ball[1].a=0;ball[1].b=0;drawB=false;match.play();pause=5;p3Dead=true;begin=0;win=1;winner=3;stringWin="Player 3 Wins";}
            else if(p4Dead==false && p3Dead==true && p2Dead==true && p1Dead==true){ball[0].x = 325;ball[0].y = 325;ball[1].x = 325;ball[1].y = 325;
                ball[0].a=0;ball[0].b=0;ball[1].a=0;ball[1].b=0;drawB=false;match.play();pause=5;p4Dead=true;begin=0;win=1;winner=4;stringWin="Player 4 Wins";}       
        public boolean countDead()
            if(gameflag==2)
                if(p4Dead==true)a1=1;if(p3Dead==true)b1=1;if(p2Dead==true)c1=1;if(p1Dead==true)d1=1;
                dead = a1 + b1 + c1 + d1;
                if(dead>2)return true;
                else return false;
            if(gameflag==3 || gameflag==4)
                if(p2Dead==true)c1=1;if(p1Dead==true)d1=1;
                dead = c1 + d1;
                if(dead==1) return true;
                else return false;
            return false;
        public void physicsintro()
            for(int aw = 0;aw<8;aw++)
                if(ball2[aw].x >645 || ball2[aw].x < 5)ball2[aw].a *= -1;
                if(ball2[aw].y > 720 || ball2[aw].y <5)ball2[aw].b *= -1;
        public void mouseExited(MouseEvent e){}
        public void mouseEntered(MouseEvent e){}
        public void mouseReleased(MouseEvent e){}
        public void mousePressed(MouseEvent e){}
        public void mouseClicked(MouseEvent e) 
                // resume
                if(pause==1 && e.getX()>=270 && e.getX()<= 360 && e.getY()>=650)
                    pauseB=false;pause=0;
                // pause
                else if(pause==0 && e.getX()>=270 && e.getX()<= 360 && e.getY()>=650)
                   pauseB=true;pause=1;             
                //start
                else if(begin == 0 && e.getX()>=270 && e.getX()<= 360 && e.getY()>=650)
                    starter = 1;              
        public void mouseMoved(MouseEvent e)
            //gui light up
            if(e.getX()>=270 && e.getX()<= 360 && e.getY()>=650){Color1 = new Color(255,255,255);}
            else{Color1 = new Color(0,0,0);}         
            repaint();
        public void mouseDragged(MouseEvent e){}
        public void keyTyped(KeyEvent e){}
        public void keyPressed(KeyEvent e)
            c = e.getKeyCode();
            if(gameflag==2 || gameflag==3)
            switch(c)
                case KeyEvent.VK_1:
                movecheck1 = 1;break;
                case KeyEvent.VK_2:
                movecheck1 = -1;break;           
                case KeyEvent.VK_V:
                movecheck2 = 1;break;
                case KeyEvent.VK_B:
                movecheck2 = -1;break;
                case KeyEvent.VK_K:
                movecheck3 = 1;break;
                case KeyEvent.VK_L:
                movecheck3 = -1;break;
                case KeyEvent.VK_LEFT:
                movecheck4 = 1;break;
                case KeyEvent.VK_DOWN:
                movecheck4 = -1;break;
            if(gameflag==1)
            switch(c)
                case KeyEvent.VK_UP:
                if(colorChange==0)colorChange=2;
                else if(colorChange==1)colorChange=0;
                else if(colorChange==2)colorChange=1;break;
                case KeyEvent.VK_DOWN:
                if(colorChange==0)colorChange=1;
                else if(colorChange==1)colorChange=2;
                else if(colorChange==2)colorChange=0;break;
                case KeyEvent.VK_ENTER:
                if(colorChange==0)gameflag=2;
                if(colorChange==1)gameflag=3;
                if(colorChange==2)gameflag=4;
                 break;
        public void keyReleased(KeyEvent e)
            c = e.getKeyCode();
            if (gameflag==2 || gameflag==3)
            switch(c)
                case KeyEvent.VK_1:
                movecheck1 = 0;break;
                case KeyEvent.VK_2:
                movecheck1 = 0;break;
                case KeyEvent.VK_V:
                movecheck2 = 0;break;
                case KeyEvent.VK_B:
                movecheck2 = 0;break;
                case KeyEvent.VK_K:
                movecheck3 = 0;break;
                case KeyEvent.VK_L:
                movecheck3 = 0;break;
                case KeyEvent.VK_LEFT:
                movecheck4 = 0;break;
                case KeyEvent.VK_DOWN:
                movecheck4 = 0;break;
    {co                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  

    Japplet is Swing. Your double buffering code is unneccessary. And you are painting wrong. You should be using paintComponent and not paint. And throw away the
    buffered image and update while you are at it.

  • Alternative to Double-Buffered Canvas

    I am working on a program in which I use a double-buffered Canvas inside a JScrollPane. The problem is that the Canvas draws over the scrollbars. I have tried extending JComponent, JPanel, JApplet, and Component instead of Canvas, and none of them are double buffered. Here is the code I used to debug this problem:
    import java.awt.*;
    import java.awt.geom.*;
    import java.awt.image.*;
    import javax.swing.*;
    public class Test implements  Runnable
         JFrame f;
         JScrollPane scroller;
         JPanel panel;
         TestCanvas canvas;
         Thread runner;
         BufferStrategy strategy;
         public static void main (String[] args) {
              Test app = new Test();
              app.init();
         public void init() {
              f = new JFrame();
              f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              panel = new JPanel();
              canvas = new TestCanvas();
              panel.add(canvas);
              scroller = new JScrollPane(panel);
              scroller.setWheelScrollingEnabled(true);
              f.getContentPane().add(scroller);
              f.pack();
              f.setSize(300,300);
              f.setVisible(true);
              canvas.createBufferStrategy(2);
              strategy = canvas.getBufferStrategy();
              runner = new Thread(this);
              runner.run();
         public void run() {
              int x = 0;
              while(x != 65536) {
                   Graphics2D g = (Graphics2D)strategy.getDrawGraphics().create();
                   g.setColor(new Color(x%256,0,0));
                   g.fill(new Ellipse2D.Double(0,0,600,600));
                   strategy.show();
                   x++;
    }Any suggestions?

    The main culprit is that you are mixing AWT components with Swing ones.
    In addition, your are doing so many of useless things and wrong things in your code.
    Swing components are defaulted for using double-buffering.
    See: http://java.sun.com/products/jfc/tsc/articles/painting/index.html
    Try and study this code.
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.geom.*;
    import java.awt.image.*;
    import javax.swing.*;
    public class Fox1229{
      JFrame f;
      JScrollPane scroller;
      TestCanvas canvas;
      int x;
      Timer t;
      public static void main (String[] args) {
        Fox1229 app = new Fox1229();
        app.init();
      public void init() {
        x = 0;
        f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        canvas = new TestCanvas();
        scroller = new JScrollPane(canvas);
        scroller.setWheelScrollingEnabled(true);
        f.getContentPane().add(scroller, BorderLayout.CENTER);
        f.setSize(300, 300);
        f.setVisible(true);
        t = new Timer(50, new ActionListener(){
          public void actionPerformed(ActionEvent e){
            canvas.setOc(new Color(x % 256, 0, 0));
            canvas.repaint();
            if (++x == 1024){
              t.stop();
        t.start();
    class TestCanvas extends JPanel{
      Color oc;
      public TestCanvas (){
        oc = new Color(0, 0, 0);
      public void setOc(Color c){
        oc = c;
      public Dimension getPreferredSize(){
        return new Dimension(600, 600);
      public void paintComponent(Graphics g){
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D)g;
        g2d.setColor(Color.blue);
        g2d.fill(new Rectangle(0, 0, 600, 600));
        g2d.setColor(oc);
        g2d.fill(new Ellipse2D.Double(0, 0, 600, 600));
    }

  • How do I save an avi from images acquired through buffers?

    Hi all,
    I recently have started using Labview, mainly for IMAQ purposes. I started by learning how to save images, then how to do just avi's. Now the problem comes up is that I want to find a way to average a bunch of images together in real time. So that as the program runs (I dont have to actually be recording) I can have an out put of what the camera sees, just with maybe 10+ frames averaged together. Best way I could think of doing this was using buffers and then adding them all together before it starts to write overtop of them again. But how can I save that summed picture? I try to take that result and run it to an image on the front panel (which works) but when I go to save it to avi or something it says that I can not convert buffer images, also if I try to do the copy buffer it gives me that the image needs to be released. I will attach sort of what I have now, though it does not work.
    Any ideas would be helpful. Thank you all very much!
    -Dave
    Attachments:
    SummingPics.vi ‏164 KB

    This may not help at all...
    But have you thought of not using buffers?
    Since you're using the IMAQ package anyway, if you don't need a super high frame rate why don't you just grab individual images put them into a shift reg. and sum for x=n, then plop that summed image to a new imaq image to save and start over.  I say this because if you're only trying to grab an avi for the individual images why not just grab the individual images as jpgs or whatnot and save yourself the trouble?

  • Double buffering && repaint

    Hi there,
    I have a frame F that contains two panels P1 and P2.
    P1 uses double buffering for drawing circles and lines.
    P2 has buttons and a JList.
    When i click on a JList to have popup menu
    or when i move the frame F on the screen
    the panel P2 lost some of JList drawing.
    Actually i iconify the frame in order to oblige
    JVM to do repaint.
    How can i resolve this problem please.

    Do not ever mix heavyweight and lightweight, or else
    you won't be able to set up the correct zorder.But when i iconfiy and desiconify my frame Java
    repaint correctly.
    I need a nice tip article of how to simulate
    desiconify repainting process.
    Thabk u

  • Double buffering circle not round

    I am making an applet where some circles are painted to the screen. When not using the double buffering scenario, the shapes appear correctly.
    The problem is when i use the double-buffering technique, the circles are still there, but they look like very ugly. I would call that some "squarcles".
    What is the bug here and how to get some decent double buffering with thoses circles?

    Here is the code so far i have that is used for painting on the screen:
    // Declaration
    private BufferedImage ecran;
    private Graphics2D buffer_ecran;
    // Instantiation
    this.ecran = new BufferedImage(getSize().width, getSize().height, BufferedImage.TYPE_INT_ARGB);
    this.buffer_ecran = ecran.createGraphics();
    // In paint() method
    Graphics be = buffer_ecran;
      // Clean the surface
    be.setColor(Color.WHITE);
    be.fillRect(0, 0, getSize().width, getSize().height);
      // Draw the circles
    be.setColor(Color.RED);
    be.drawOval(x, y, ra, rb);
      // Output the buffer to the screen
    g.drawImage(ecran, 0, 0, this);I was previously using Image and changed to BufferedImage with the hope it would resolve the situation. I can't tell a significant change in image display.

  • Double buffering on large pane

    I have a large JPanel which I'm drawing onto which is about 5000 x 5000. To eliminate screen flicker when dragging objects I'm trying to use double buffering. The problem is the image is too big and I get an out of memory error message.
    I've tried using clipped rectangles to display just the size of image needed but they give erratic results or the scrolling doesn't work. I need it to display the rest of the image when scrolling. Does anyone have any suggestions on how to solve this?
    I've thought about creating the image to be just the size of the screen and to just have the objects that are meant to be at that part but I think this would involve going from device space from user space but I don't know how to do this. Thanks.
    Alan

    ok, if you want it to be interactive with scrolling, then you have to keep the image large, but unless your video card has 71.5MB free space for that image, you're not going to get good results, not to mention CPU will be hurting if you need to do any processing of the image (transforms, loads, saves, etc.)
    options:
    1. forget interaction and just get the viewable image area and paint that portion of the image
    2. Get a graphics supercomputer!
    3. try to fake the interaction somehow
    what else? dunno, did that help

  • Flickering vs double buffering

    Hello,
    flickering is a common problem and is prevented by using offscreen images. And that's what I'm doing (though, I'm not sure whether I'm doing it right). Now, there's a cycle of images displayed as an animation in my program and the flickering is really obvious while the first cycle is being displayed. It seems more or less OK when it plays further (I'm not realy sure whether it flickers or not, coz the images are being repainted rather fast).
    So, my question is: why exactly could the first cycle be displayed so slowly and how could I fix the problem? (perhaps double buffering should fix it and I'm doing it wrong?)

    Are you loading all images before showing the animations ? Because if you are loading them as you're showing the animations the loading process will slow your animation down.

  • Strange double buffering bug

    Hi all,
    I have stumbled on strange swing behavior on Windows, most probably connected to double buffering introduced in java 6.
    Once in a while Windows stops redrawing my JFrame. From the java side everything seems ok - all the components are painted (that is, all native methods called), EventQueue normally processed by EDT, but repainted GUI is not shown on the screen. Note that OS has the repainted info - if I cover part of the application window with another window (e.g. explorer), and hid it back, the part that was covered is repainted. This happens even if I have java app halted on debug, so no other java actions can cause this repaint - OS has to have this image, it just does not put it on the screen. When I minimize/maximize the app, everything goes back to normal.
    Note that I can normally operate the app "as if" it was painted - I can change tabs, click buttons (even though I can't see them), and results of these actions are painted by java to some offscreen buffer, but are only shown when I cover/uncover my app with another window, or min/max it. Min/Maxing ends this strange state and further repaints are shown normally.
    Did any of you have this kind of problem? Any idea how to approach/resolve it or what can be the cause?
    Java is 1.6.20, I have seen the behavior on Windows XP, Vista and 2008. It is not reproducible, it just happens sometimes. I haven't seen that on Java 5. Turning off double buffering resolves that, but is not feasible due to degraded user experience.
    Thanks in advance for your help!
    Jakub

    Thanks for your help so far, perhabs this is something with the driver, but I use fairly generic windows distribution.
    EDT is not hosed, it is processing events normally (I checked that on debug step-by-step). We do not override any paint methods, and this is rather something on different level - it is not "a component not being repainted" it is "everything is repainted, but not shown on screen". Including tabbedPane's tab changes, menu display, etc. I can even see cursor changing into carret when I hover over "not shown" textfield.
    Displaying and then disposing of modal dialog also fixes the state, as do resizing of the JFrame.

Maybe you are looking for