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

Reply via email to