Success.

Thanks to all who responded.  Michael Schmid's fix worked.

He suggested two additions to my code:

a) insert IJ.wait(200) before getting the window, 
b) adding win.toFront() (again, with an IJ.wait(200) before it.

I changed the waits to IJ.wait(500) and added win.toFront as he suggested, and 
all is well.

Now, I think I'll implement the new plugin using the same style - for 
consistent behavior by the users.

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





> On Oct 22, 2024, at 09:18, Michael Schmid <[email protected]> wrote:
> 
> 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


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

Reply via email to