Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-6519693

setIgnoreRepaint(true) only works once

    XMLWordPrintable

Details

    • Bug
    • Resolution: Not an Issue
    • P3
    • None
    • 5.0
    • client-libs
    • x86
    • windows_2000

    Description

      FULL PRODUCT VERSION :
      D:\jdk1.5\bin>java -version
      java version "1.5.0_09"
      Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_09-b03)
      Java HotSpot(TM) Client VM (build 1.5.0_09-b03, mixed mode, sharing)

      ADDITIONAL OS VERSION INFORMATION :
      Microsoft Windows 2000 [Version 5.00.2195]

      A DESCRIPTION OF THE PROBLEM :
      setIgnoreRepaint(true) works great once. If I setIgnoreRepaint(false) then setIgnoreRepaint(true) in sequence, then the component is repainted on any and all paint events.

      I setIgnoreRepaint(true) to draw multiple times into a Canvas without flicker. Then setIgnoreRepaint(false) so that expose events are handled. Subsequently, if I again setIgnoreRepaint(true) -- that doesn't stop paint() events from being received by my Canvas.



      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      setIgnoreRepaint(true)

      <do some rapid drawing>

      setIgnoreRepaint(false)

      <handle some expose events>

      setIgnoreRepaint(false)

      <do some rapid drawing and notice flicker from paint() events being handled.

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      I expect to stop paint() event caused flicker yet be able to handle expose events inbetween drawing actions.
      ACTUAL -
      setIgnoreRepaint(true) works only the first time. Subsequent setIgnoreRepaint(true) don't work.

      ERROR MESSAGES/STACK TRACES THAT OCCUR :
      No error messages.

      REPRODUCIBILITY :
      This bug can be reproduced always.

      ---------- BEGIN SOURCE ----------
      package pancyl;

      import java.awt.*;
      import java.awt.image.*;


      public class PanCylProjector
      {
          private BufferedImage image = null;
          private BufferedImage subImage = null;
          private Raster raster = null;
          private WritableRaster dataRas = null;
          private WritableRaster midRas = null;
          private WritableRaster leftRas = null;
          private WritableRaster rightRas = null;
          private WritableRaster subRaster = null;
          private ColorModel cm = null;
          private int imageW, imageH = 0;
          private int canvasW, canvasH = 0;
          private double RADIUS = 0.0;
          private DataBuffer dataBuffer = null;
          private PanCylCanvas canvas = null;
          private int viewPointX, viewPointY = 0;
          private int dx, dy = 0;
          private int canvasCenterX, canvasCenterY = 0;
          private int halfCanvasW, halfCanvasH = 0;
          private double MAXDX, MAXDY = 0.0;
          private int subImageX, subImageY = 0;
          private double MOVEFACTOR = 0.05;
          private int leftX, leftW, rightX, rightW = 0;
          public PanCylProjector()
          {
              // TODO Auto-generated constructor stub
          }
          public void setCanvas(PanCylCanvas c)
          {
              canvas = c;
              canvasW = canvas.getWidth();
              canvasH = canvas.getHeight();
              halfCanvasW = canvasW / 2;
              halfCanvasH = canvasH / 2;
              canvasCenterX = (int)((canvasW / 2.0) + 0.5);
              canvasCenterY = (int)((canvasH / 2.0) + 0.5);
          }
          public void setImage(BufferedImage i)
          {
              if(PanCylApplet.DEBUG)
                  System.err.println("Projector: setting image");
              image = i;
              imageW = image.getWidth();
              imageH = image.getHeight();
              MAXDX = imageW * MOVEFACTOR;
              MAXDY = imageH * MOVEFACTOR;
              viewPointX = (int)((imageW / 2.0) + 0.5);
              viewPointY = (int)((imageH / 2.0) + 0.5);
              subImageX = viewPointX - halfCanvasW;
              subImageY = viewPointY - halfCanvasH;

              RADIUS = imageW / (2.0 * Math.PI);
              cm = image.getColorModel();
              raster = (WritableRaster)image.getRaster();
              subRaster = (WritableRaster)image.getData(new Rectangle(subImageX, subImageY, canvasW, canvasH));
              subRaster = subRaster.createWritableTranslatedChild(0, 0);
              canvas.setSubRaster(subRaster);
              canvas.repaint();
          }
          public boolean mouseDown = false;
          public int mouseX, mouseY = 0;
          public void setMouseDown(boolean b)
          {
              mouseDown = b;
              System.err.println("setMouseDown(" + b + ")");
              if(mouseDown)
              {
                  canvas.setIgnoreRepaint(true);
                  Runnable r = new Runnable()
                  {
                      public void run()
                      {
                          canvas.setIgnoreRepaint(true);
                          mouseEvent();
                          canvas.setIgnoreRepaint(false);
                      }
                  };
                  new Thread(r).start();
              }
              else
                  canvas.setIgnoreRepaint(false);
          }
          public void setMousePosition(int x, int y)
          {
              mouseX = x;
              mouseY = y;
          }

          public void mouseEvent()
          {
              
              while (mouseDown == true)
              {
                  try
                  {
                      Thread.yield();
                      Thread.sleep(10);
                      subImageX += (int) ((((double) mouseX - (double) halfCanvasW) / (double) canvasW) * MAXDX);
                      subImageY += (int) ((((double) mouseY - (double) halfCanvasH) / (double) canvasH) * MAXDY);
                      if ((subImageY + canvasH) > imageH)
                          subImageY = imageH - canvasH - 1;
                      if ((subImageY) < 0)
                          subImageY = 0;
                      if (subImageX < 0)
                          subImageX = imageW + subImageX;
                      if (subImageX > (imageW - 1))
                          subImageX = subImageX - imageW;
                      //System.err.println("subImageX = " + subImageX + ", subImageY = " + subImageY);
                      if ((subImageX + canvasW) >= imageW)
                      {
                          leftW = imageW - subImageX;
                          rightW = canvasW - leftW;
                          leftRas = (WritableRaster) raster.createChild(subImageX, subImageY, leftW, canvasH, 0, 0, null);
                          rightRas = (WritableRaster) raster.createChild(0, subImageY, rightW, canvasH, 0, 0, null);
                          subRaster.setRect(0, 0, leftRas);
                          subRaster.setRect(leftW, 0, rightRas);
                          canvas.setSubRaster(subRaster);
                          canvas.repaint();

                      }
                      else
                      {
                          midRas = (WritableRaster) raster.createChild(subImageX, subImageY, canvasW, canvasH, 0, 0, null);
                          canvas.setSubRaster(midRas);
                          canvas.repaint();
                      }
                  }
                  catch (InterruptedException e)
                  {
                      System.err.println("Exception in mouseEvent()");
                  }
              }
          }
      }
      ---------- END SOURCE ----------

      CUSTOMER SUBMITTED WORKAROUND :
      None that I can figure out.

      Attachments

        Activity

          People

            son Oleg Sukhodolsky (Inactive)
            dav Andrei Dmitriev (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:
              Imported:
              Indexed: