With the caveat I'm new to JRuby but have 20 years of software
experience:

I like when learning a new language to play around with how to do
things.  So in one case I did the two standard java idioms in JRuby to
display an image [methods dispaly and display2], and then decided to
try the Ruby idiom of modifying an object on the fly and over-ride
it's paintComponent(g) method as shown below [method display3].  I am
pretty sure I got the idiom right, so am I bumping up against a
limitation of JRuby or have I botched the invocation or is it a
bug....

module TinoGraphics
 require 'java'
 import java.awt.image.BufferedImage
 import javax.swing.JButton
 import javax.swing.JFrame
 class TGPanel < javax.swing.JPanel
   def initialize(image)
     @image=image
     super()
   end
   def paintComponent(g)
     g.drawImage(@image,0,0,@image.getWidth,@image.getHeight,self)
     puts "paintComponent of TGPanel"
   end
 end

 class Utility
   def initialize
     #for future use
   end
   def resize(original,xscale,yscale)
     x=original.getWidth/xscale
     y=original.getHeight/yscale
     b2=original.getScaledInstance(x,y,BufferedImage::SCALE_SMOOTH)
     bi2=BufferedImage.new(x,y,BufferedImage::TYPE_INT_RGB)
     graphics = bi2.createGraphics
     graphics.drawImage(b2,0,0,nil)
     graphics.dispose
     return bi2
   end
   def resize(original,x,y)
     b2=original.getScaledInstance(x,y,BufferedImage::SCALE_SMOOTH)
     bi2=BufferedImage.new(x,y,BufferedImage::TYPE_INT_RGB)
     graphics = bi2.createGraphics
     graphics.drawImage(b2,0,0,nil)
     graphics.dispose
     return bi2
   end
   def display(image) #plain old JButton/Icon hack
     x=image.getWidth
     y=image.getHeight
     frame=JFrame.new("Quick Display")
     frame.setSize(x,y)
     panel=JButton.new(javax.swing.ImageIcon.new(image))
     frame.setContentPane(panel)
     frame.setVisible(true)
   end
   def display2(image) #using inheritance
     x=image.getWidth
     y=image.getHeight
     frame=JFrame.new("Quick Display 2")
     frame.setSize(x,y)
     panel=TGPanel.new(image)

     frame.setContentPane(panel)
     frame.setVisible(true)
   end
   def display3(image) #using anonymous instance
     x=image.getWidth
     y=image.getHeight
     frame=JFrame.new("Quick Display 3")
     frame.setSize(x,y)
     panel=javax.swing.JPanel.new
#let's do an instance over-ride.
     class << panel
       def setImage(image)
         @image=image
       end
       def getImage
         @image
       end
       def paintComponent(g)
         g.drawImage(@image,
0,0,@image.getWidth,@image.getHeight,self)
         puts "paintComponent of panel instance"
       end
     end
     panel.setImage(image)
     frame.setContentPane(panel)
     frame.setVisible(true)
     frame.repaint
   end
 end
end

import javax.imageio.ImageIO
#debugger will need to insert their own jpg file below
img = ImageIO.read(java.io.File.new("G:\\wildpics\
\crystal_face.jpg"));
u=TinoGraphics::Utility.new
u.display2(img) #works as expected!
u.display3(img) #does not work :(