Hi Kenneth,

the following works for me (on a newly created ImagePlus named 'displayFFTimp'):


  //wait a bit after a previous WaitForUserDialog has come up
  IJ.wait(200);
  ImageWindow win = displayFFTimp.getWindow();
  win.toFront();

  IJ.wait(200);
  //probably not needed
  displayFFTimp.getCanvas().addKeyListener(this);

  displayFFTimp.getCanvas().removeKeyListener(IJ.getInstance());

  displayFFTimp.getWindow().addKeyListener(this);

  displayFFTimp.getWindow().removeKeyListener(IJ.getInstance());


public void keyTyped(KeyEvent e) {...}


public void keyPressed(KeyEvent e) {
...}

public void keyReleased(KeyEvent e) {...}



Michael
________________________________________________________________
On 22.10.24 14:41, Kenneth R Sloan wrote:
Also note that there is no log output from keyPressed(), which on the
surface points away from wait/notify as the problem.

And… key presses appear to me to be handled by ImageJ.  Right now I’m
focusing on the removeListener() call.

-Kenneth Sloan


On Tue, Oct 22, 2024 at 08:36 Kenneth R Sloan <[email protected]>
wrote:

Thanks - I’ll look into it.  I’ve key point is that this plugin worked
perfectly in 2020, but fails now.

It turns out that my collaborator now actually prefers checkboxes over key
presses, so I might put this problem on the shelf for awhile.


-Kenneth Sloan


On Tue, Oct 22, 2024 at 08:08 Michael Schmid <[email protected]>
wrote:

Hi Kenneth,

as far as I can say, KeyListeners on ImageWindow and ImageCanvas work
well, also in the current version of ImageJ. I have a plugin with
essentially the same calls to removeKeyListener and addKeyListener in
regular use.

Of course, the KeyListener of an image only works if that image is in
the foreground. It won't work if the ImageJ panel (or something else)
has focus.

My suspicion is that the problem is not related to the KeyListener but
rather to the synchronization and/or wait-notify construct.

What is the function that the KeyListener is supposed to trigger?
If does not take significant computation time, I usually put that
directly into the keyPressed method. The wait-notify construct is needed
only if the operation can take longer than a fraction of a second. The
keyPressed callback is executed in the EventQueue; if one puts long
calculations there, the GUI becomes slow.

Just to make sure, one trivial mistake that sometimes happens is that
"this" refers to different Objects, e.g. because one has an inner class.


Michael
________________________________________________________________
On 21.10.24 17:59, Kenneth Sloan wrote:
I’m reviving an ImageJ Java plugin from 2020.  It  uses a KeyListener.
The new build does not get any keypresses.  I’ve looked at the current
documentation, and can’t find a problem.  The plugin is fairly large.  I’ll
try to make a minimal version - but would be happy to share it on my
ImageJ Update Site (see below).

Remember - this plugin worked fine in 2020, but now fails.

Here is what I think is the relevant code:

       // listen to keyboard - stop IJ from listening!
       win = ipl.getWindow();  // delayed until we are SURE it's visible
       IJ.log("win = "+win);
       canvas = win.getCanvas();
       IJ.log("canvas = "+canvas);
       win.removeKeyListener(IJ.getInstance());
       canvas.removeKeyListener(IJ.getInstance());
       IJ.log("removed IJ Listeners");
       win.addKeyListener(this);
       canvas.addKeyListener(this);
       ImagePlus.addImageListener(this);
       IJ.log("added Listeners");

…

       win.requestFocus();
       IJ.log("sampling...”);
       category = sampleAt(xList.get(currentSamplePoint),

  yList.get(currentSamplePoint));
       IJ.log("sampled”);

…

       while(true)
           {
               synchronized(this)
                   {
                       IJ.log("waiting...");
                       wait(); // keyPressed wakes us
                       IJ.log("woken up!");
                   }

…

               // key pressed!
               // keyCode, keyChar, and modifiers are current
               If(keyCode == KeyEvent.VK_SPACE) return -1; // DELETE
does not work
               if(keyCode == KeyEvent.VK_ENTER) return -2; // no mas!
               int category = keyCode - KeyEvent.VK_1; // 1-based keys;
0-based category
               if(category < 0) continue; // try again!
               if(category >= choices.length) continue; // try again!
               return category; // good category!
           }
...
      @Override
       public void keyPressed(KeyEvent e)
      {
       IJ.log("keyPressed");
       keyCode = e.getKeyCode();
       keyChar = e.getKeyChar();
       modifiers = e.getModifiers();
       IJ.log("   "+keyCode+"   "+keyChar+"   "+modifiers);
       synchronized(this)
           {
               IJ.log("notifying");
               notify();
               IJ.log("notified");
           }
      }

And here is the IJ Log:

win = 16385_175994_R_IR_OCT_20120429-09_8C3F4720.bmp
canvas = ij.gui.ImageCanvas[canvas1,5,44,384x496]
removed IJ Listeners
added Listeners
sampling...
sampleAt(90.05, 63.05)
waiting...

It looks to me as if we  “wait” and then never get a KeyPress event.

When I press keys, I seem to get the usual ImageJ responses (does this
mean that the IJ Listeners were NOT removed?



Update site: CreativeComputation
Plugin name: AVL_Area_Fraction

—
Kenneth Sloan
[email protected]
Vision is the art of seeing what is invisible to others.

--
ImageJ mailing list: http://imagej.nih.gov/ij/list.html

--
ImageJ mailing list: http://imagej.nih.gov/ij/list.html



--
ImageJ mailing list: http://imagej.nih.gov/ij/list.html

--
ImageJ mailing list: http://imagej.nih.gov/ij/list.html

Reply via email to