Search code examples
javapython-2.7jython-2.7

Translate Java code into Jython code


The code below is written in Java. It has been shortened to simplify the time required for an answer. The full code takes a screenshot and copies it to the clipboard. (Source: http://www.coderanch.com/t/333565/GUI/java/BufferedImage-System-Clipboard)

I am trying to use it in a Jython 2.7 program. I'm confused on how to alter this code because of all the private classes involved.

 public class ClipboardImage implements ClipboardOwner {
     public ClipboardImage() {
      try {
        Robot robot = new Robot();
        Dimension screenSize  = Toolkit.getDefaultToolkit().getScreenSize();
        Rectangle screen = new Rectangle( screenSize );
        BufferedImage i = robot.createScreenCapture( screen );
        TransferableImage trans = new TransferableImage( i );
        Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
        c.setContents( trans, this );
    }
    catch ( AWTException x ) {
        x.printStackTrace();
        System.exit( 1 );
    }
 }

    public static void main( String[] arg ) {
         ClipboardImage ci = new ClipboardImage();
    }

     public void lostOwnership( Clipboard clip, Transferable trans ) {
         System.out.println( "Lost Clipboard Ownership" );
     }

     private class TransferableImage implements Transferable {

         Image i;

         public TransferableImage( Image i ) {
             this.i = i;
         }

         public Object getTransferData( DataFlavor flavor ) 
         throws UnsupportedFlavorException, IOException {
             if ( flavor.equals( DataFlavor.imageFlavor ) && i != null ) {
                 return i;
             }
             else {
                 throw new UnsupportedFlavorException( flavor );
             }
         }

         public DataFlavor[] getTransferDataFlavors() {
             DataFlavor[] flavors = new DataFlavor[ 1 ];
             flavors[ 0 ] = DataFlavor.imageFlavor;
             return flavors;
         }

         public boolean isDataFlavorSupported( DataFlavor flavor ) {
             DataFlavor[] flavors = getTransferDataFlavors();
             for ( int i = 0; i < flavors.length; i++ ) {
                 if ( flavor.equals( flavors[ i ] ) ) {
                     return true;
                 }
             }

             return false;
         }
     }
 }

I've been able to translate it to the following code:

robot = Robot()
screenSize  = Toolkit.getDefaultToolkit().getScreenSize()
screen = Rectangle(screenSize)
i = robot.createScreenCapture(screen)
flavors = DataFlavor.imageFlavor.equals(i)
trans = Transferable.getTransferDataFlavors(flavors)
c = Toolkit.getDefaultToolkit().getSystemClipboard()
c.setContents(trans, trans)

However, I'm getting a TypeError:

getTransferDataFlavors(): self arg can't be coerced to java.awt.datatransfer.Transferable.

I'm struggling with the part of assigning the dataFlavor.imageFlavor to my image, and then making it transferable, so I can set it to clipboard contents.


Solution

  • class TransferableImage(Transferable) :
    
         def __init__(self, image) :
                 if not isinstance(image, Image) :
                          raise IllegalArgumentException("Parameter must be of type java.awt.Image")
                 self.image = image
    
         def getTransferData(self, flavor) :
                 if not isinstance(flavor, DataFlavor) :
                          raise IllegalArgumentException("Parameter must be of type java.awt.datatransfer.DataFlavor")
                 if not flavor.equals(DataFlavor.imageFlavor) : 
                          raise UnsupportedFlavorException(flavor)
                 return self.image
    
         def getTransferDataFlavors(self) :
                 return [DataFlavor.imageFlavor];
    
         def isDataFlavorSupported(self, flavor) :
                 if not isinstance(flavor, DataFlavor) :
                          raise IllegalArgumentException("Parameter must be of type java.awt.datatransfer.DataFlavor")
                 return flavor in getTransferFlavors()
    
    class ClipboardImage(ClipboardOwner) :
    
         def __init__(self) :
                 robot = Robot()
                 toolkit = Toolkit.getDefaultToolkit()
                 screenSize = toolkit.getScreenSize()
                 screen = Rectangle(screenSize)
                 image = robot.createScreenCapture(screen)
                 trans = TransferableImage(image)
                 clipboard = toolkit.getSystemClipboard()
                 clipboard.setContents(trans, self)
    
         def lostOwnership(self, clip, trans) :
                 print("Lost Clipboard Ownership")
    
    
    ci = ClipboardImage()