Solved

take off blinking while dragging an image ??

Posted on 1998-07-06
6
203 Views
Last Modified: 2010-04-16
Hi experts, I'd like to know how to take off the blinking while dragging an image? (for JDK 1.0.2)

 Thank you.
0
Comment
Question by:Deladier
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
  • 3
6 Comments
 
LVL 16

Expert Comment

by:imladris
ID: 1224900
How is the dragging being done?

0
 

Author Comment

by:Deladier
ID: 1224901
Sorry. Dragging way is:

    public boolean mouseDrag(Event ev, int x, int y) {
      if(over == 1) { //over an image
         x = x - 8; //center image
         y = y - 6; //center image
          ima.setElementAt((new Integer(x)), (which+6));
          ima.setElementAt((new Integer(y)), (which+7));
        repaint();
      }

        for(int z=0; z<=((ima.size())-8); z=z+8) { //for1
         dy = Integer.valueOf(ima.elementAt(z+7).toString()).intValue();
         if(y>=dy & y<=(dy+12) & y!=dy & (ima.elementAt(z+2).toString()) != "I") {
          which2 = z;
          moveOver = 1;
         }
        } //for1
     
     
     return true;
    }

In 'if' loop I know that I already pressed over an image (over = 1 from mouseDown) and not over nothing.
'ima' is a Vector with images and the respective coordinates.
Do you think 'for' loop is the problem?. This 'for' loop is used in order to recognize over what image is dragging the image
0
 
LVL 16

Expert Comment

by:imladris
ID: 1224902
No, I don't think so. I'm more concerned with the paint method. Could you post that as well? Have you overridden the update method (which clears the screen before paint is called (which will cause a flicker)?

0
Revamp Your Training Process

Drastically shorten your training time with WalkMe's advanced online training solution that Guides your trainees to action.

 

Author Comment

by:Deladier
ID: 1224903
You're right, I haven't used update method, where do I put it?.
Here's the paint method:

  public void paint(Graphics g) {
    g.drawImage(getImage(getDocumentBase(), "menutree/w_raiz.gif"), 12, 0, this);
    Font raizfuen = new Font("Courier", Font.PLAIN, 10);
    g.setFont(raizfuen);
    g.setColor(Color.blue);
    g.drawString("Root", 30, 11);
   
    g.drawImage(getImage(getDocumentBase(), "menutree/w_raiz.gif"), 65, 0, this);
    Font borrafuen = new Font("Courier", Font.PLAIN, 10);
    g.setFont(borrafuen);
    g.setColor(Color.red);
    g.drawString("Erase Element", 83, 11);
       
   for(int u=0; u<=((ima.size())-8); u=u+8) { //forqw
    if((ima.elementAt(u).toString()) == "F" &
       (ima.elementAt(u+1).toString()) == "C" &
       (ima.elementAt(u+2).toString()) == "V") { //iffc
      String nomfold = ima.elementAt(u+5).toString();
      g.drawImage(getImage(getDocumentBase(), "menutree/wcf.gif"),
      (Integer.valueOf(ima.elementAt(u + 6).toString()).intValue()),
      (Integer.valueOf(ima.elementAt(u + 7).toString()).intValue()), this);  
       Font fuente = new Font("Helvetica", Font.PLAIN, 10);
       g.setFont(fuente);      
       g.drawString(nomfold,
       ((Integer.valueOf(ima.elementAt(u + 6).toString()).intValue()) + 22),
       ((Integer.valueOf(ima.elementAt(u + 7).toString()).intValue()) + 10));    
    } //iffc

    if((ima.elementAt(u).toString()) == "F" &
       (ima.elementAt(u+1).toString()) == "A" &
       (ima.elementAt(u+2).toString()) == "V") { //iffa
      String nomfold = ima.elementAt(u+5).toString();
      g.drawImage(getImage(getDocumentBase(), "menutree/wof.gif"),
      (Integer.valueOf(ima.elementAt(u + 6).toString()).intValue()),
      (Integer.valueOf(ima.elementAt(u + 7).toString()).intValue()), this);  
       Font fuente = new Font("Helvetica", Font.PLAIN, 10);
       g.setFont(fuente);      
       g.drawString(nomfold,
       ((Integer.valueOf(ima.elementAt(u + 6).toString()).intValue()) + 22),
       ((Integer.valueOf(ima.elementAt(u + 7).toString()).intValue()) + 10));    
    } //iffa    
   
    if((ima.elementAt(u).toString()) == "B" &
       (ima.elementAt(u+2).toString()) == "V") { //aq
      String nomdoc = ima.elementAt(u+5).toString();
      g.drawImage(getImage(getDocumentBase(), "menutree/wdoc.gif"),
      (Integer.valueOf(ima.elementAt(u + 6).toString()).intValue()),
      (Integer.valueOf(ima.elementAt(u + 7).toString()).intValue()), this);  
       Font fuente = new Font("Helvetica", Font.PLAIN, 10);
       g.setFont(fuente);      
       g.drawString(nomdoc,
       ((Integer.valueOf(ima.elementAt(u + 6).toString()).intValue()) + 22),
       ((Integer.valueOf(ima.elementAt(u + 7).toString()).intValue()) + 10));
    } //aq
   
   } //forqw

    if(moveOver == 1 & (ima.elementAt(which2).toString()) == "B" &
       (ima.elementAt(which2+2).toString()) != "I") { //zx
      String nomdoc = ima.elementAt(which2+5).toString();
      g.drawImage(getImage(getDocumentBase(), "menutree/ddoc.gif"),
      (Integer.valueOf(ima.elementAt(which2 + 6).toString()).intValue()),
      (Integer.valueOf(ima.elementAt(which2 + 7).toString()).intValue()), this);  
       Font fuente = new Font("Helvetica", Font.PLAIN, 10);
       g.setFont(fuente);      
       g.drawString(nomdoc,
       ((Integer.valueOf(ima.elementAt(which2 + 6).toString()).intValue()) + 22),
       ((Integer.valueOf(ima.elementAt(which2 + 7).toString()).intValue()) + 10));
    } //zx

    if(moveOver == 1 & (ima.elementAt(which2).toString()) == "F" &
       (ima.elementAt(which2+1).toString()) == "C") { //zx1
      String nomdoc = ima.elementAt(which2+5).toString();
      g.drawImage(getImage(getDocumentBase(), "menutree/dcf.gif"),
      (Integer.valueOf(ima.elementAt(which2 + 6).toString()).intValue()),
      (Integer.valueOf(ima.elementAt(which2 + 7).toString()).intValue()), this);  
       Font fuente = new Font("Helvetica", Font.PLAIN, 10);
       g.setFont(fuente);      
       g.drawString(nomdoc,
       ((Integer.valueOf(ima.elementAt(which2 + 6).toString()).intValue()) + 22),
       ((Integer.valueOf(ima.elementAt(which2 + 7).toString()).intValue()) + 10));
    } //zx1

    if(moveOver == 1 & (ima.elementAt(which2).toString()) == "F" & 
       (ima.elementAt(which2+1).toString()) == "A") { //zx2
      String nomdoc = ima.elementAt(which2+5).toString();
      g.drawImage(getImage(getDocumentBase(), "menutree/dof.gif"),
      (Integer.valueOf(ima.elementAt(which2 + 6).toString()).intValue()),
      (Integer.valueOf(ima.elementAt(which2 + 7).toString()).intValue()), this);  
       Font fuente = new Font("Helvetica", Font.PLAIN, 10);
       g.setFont(fuente);      
       g.drawString(nomdoc,
       ((Integer.valueOf(ima.elementAt(which2 + 6).toString()).intValue()) + 22),
       ((Integer.valueOf(ima.elementAt(which2 + 7).toString()).intValue()) + 10));
    } //zx2
  }



0
 
LVL 16

Accepted Solution

by:
imladris earned 30 total points
ID: 1224904
Each component has an update method. The code is:

    public void update(Graphics g) {
      g.setColor(getBackground());
      g.fillRect(0, 0, width, height);
      g.setColor(getForeground());
      paint(g);
    }

As you can see, this method "blanks" the screen (with a fillRect set to use the background colour) and then calls paint. The advantage of this is that when your paint method is called, you start "drawing" on a clean slate. The disadvantage is the flicker. You should override the update method to be:

    public void update(Graphics g) {
      paint(g);
    }

This will remove the flicker. On the other hand, YOU are now responsible for removing old/unwanted display items. One standard way of dealing with this is to use an animation technique labelled double buffering. An offscreen display buffer is created, the current state of the display "drawn" into this buffer, then it is displayed in a single call. The following will accomplish this:

public void update(Graphics g)
{   Image bufimg;

    //create an Image the size of your display
    bufimg=createImage(width,height);
    //get graphics context for it
    Graphics bg=bufimg.getGraphics();
    //draw into it
    paint(bg);
    //put it on the screen
    g.drawImage(bufimg,0,0,null);
    //free operating system resources taken up
    bg.dispose();
    return;
}


In this scenario you are, of course, always double buffering. If that's not desirable, this mechanism can be employed in a suitable location in the code when needed. For instance, what is now the paint logic could go in a seperate method (named showScreen (for example), which takes a Graphics object as argument), and paint could call showScreen, as well as the place that required the double buffering (which would create the Graphics context from some image).

0
 

Author Comment

by:Deladier
ID: 1224905
Thanks.   :)
0

Featured Post

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

By the end of 1980s, object oriented programming using languages like C++, Simula69 and ObjectPascal gained momentum. It looked like programmers finally found the perfect language. C++ successfully combined the object oriented principles of Simula w…
Introduction This article is the first of three articles that explain why and how the Experts Exchange QA Team does test automation for our web site. This article explains our test automation goals. Then rationale is given for the tools we use to a…
Viewers learn about the “while” loop and how to utilize it correctly in Java. Additionally, viewers begin exploring how to include conditional statements within a while loop and avoid an endless loop. Define While Loop: Basic Example: Explanatio…
The viewer will learn how to implement Singleton Design Pattern in Java.

688 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question