Javaプログラミング/Javaプログラミング関連情報

クリップボードによるイメージの受け渡し(4ページ目)

グラフィック・イメージをクリップボード経由で受け渡すには、少々複雑です。イメージ受け渡し用のTransferableクラスを定義しないといけません。

執筆者:掌田 津耶乃

ソースコード・続き



class GPanel extends JPanel {
  private BufferedImage image;
  private Graphics2D graphic;
  
  public GPanel(){
    this.addMouseListener(new MouseAdapter(){
      public void mousePressed(MouseEvent e){
        graphic.fillOval(e.getX() - 5, e.getY() - 5, 10, 10);
        repaint();
      }
    });
    this.addMouseMotionListener(new MouseAdapter(){
      public void mouseDragged(MouseEvent e){
        graphic.fillOval(e.getX() - 5, e.getY() - 5, 10, 10);
        repaint();
      }
    });
  }
  
  public void paintComponent(Graphics g){
    if (image == null){
      this.setOffImage(null);
    }
    g.drawImage(image, 0, 0, this);
  }
  
  public BufferedImage getOffImage(){
    BufferedImage img = new BufferedImage(this.getWidth(),this.getHeight(),
      BufferedImage.TYPE_INT_RGB);
    Graphics g = img.getGraphics();
    g.setColor(Color.WHITE);
    g.fillRect(0, 0, img.getWidth(), img.getHeight());
    g.drawImage(image, 0, 0, this);
    g.dispose();
    return img;
  }
  
  public void setOffImage(BufferedImage img){
    if (img == null){
      image = this.getOffImage();
    } else {
      image = img;
    }
    graphic = image.createGraphics();
    graphic.setColor(Color.BLACK);
    repaint();
  }
  
  public void cut(){
    this.copy();
    this.setOffImage(null); // オフスクリーンイメージの設定
  }

  public void copy(){
    BufferedImage img = this.getOffImage();
    Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
    ImageSelection imgselection = new ImageSelection(img);
    clipboard.setContents(imgselection, null);
  }

  public void paste(){
    Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
    Transferable object = clipboard.getContents(null);
    try {
      BufferedImage image = (BufferedImage)object.getTransferData(DataFlavor.imageFlavor);
      this.setOffImage(image); // オフスクリーンイメージの設定
    } catch (UnsupportedFlavorException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

// ImageSelectionクラスは省略

マウスでドラッグすると絵が描ける。メニューを選んで、描いた絵をカット・コピーしたり、他のソフトからペーストしたりできる。


ここでは、マウスでウインドウ内をドラッグして簡単な絵を描くグラフィックツールを用意しました。これに、メニューを使ってカット&ペースト機能を組み込んでいます。既にクリップボード関係の処理は説明済みですから、これがどうやってアプリケーションに保管されているBufferedImageとやりとりされるか(getOffImage/setOffImage)を見ておきましょう。その連携さえわかれば、あなた自身のアプリケーションに組み込むのは簡単ですね!

また、Java SE 6.0からは、データの受け渡しをするものとして、Transferableなクラス「DataHandler」というものが用意されています。これは、DataSourceというクラスと組み合わせることで、特定のファイルや指定のURLからデータを読み込み、クリップボードに保管したりといったことが簡単に行えるようになっています。興味ある人はそれぞれで調べてみましょう。
【編集部おすすめの購入サイト】
楽天市場で Java 関連の書籍を見るAmazon で Java 関連の書籍を見る
  • 前のページへ
  • 1
  • 2
  • 3
  • 4
※記事内容は執筆時点のものです。最新の内容をご確認ください。
※OSやアプリ、ソフトのバージョンによっては画面表示、操作方法が異なる可能性があります。

あわせて読みたい

あなたにオススメ

    表示について

    カテゴリー一覧

    All Aboutサービス・メディア

    All About公式SNS
    日々の生活や仕事を楽しむための情報を毎日お届けします。
    公式SNS一覧
    © All About, Inc. All rights reserved. 掲載の記事・写真・イラストなど、すべてのコンテンツの無断複写・転載・公衆送信等を禁じます