Cazperのつれづれ日記: 【JFreeChart】グラフをコピー【クリップボード】

« 為替FX?いやいやJavaFX | メイン | 大きい政府だって万能じゃない »

2009年1月28日

panda01.gif 【JFreeChart】グラフをコピー【クリップボード】

JFreeChartのグラフをクリップボードへコピーする方法をご紹介します。

JFreeChartでは、作成したグラフをPNGやらJPG等で保存する関数は予め用意されています。しかし、グラフをクリップボードへコピーする関数は用意されておりません。

そこで、自前で画像をクリップボードへコピーする関数を用意しなければなりません。この関数自体はJFreeChart専用というわけではないので、画像をクリップボードへコピーしたい方にも参考になると思います。


実際にソースを見てみましょう。以下のファイルはJFrameを用意してグラフを描画し、クリップボードへコピーする関数を呼び出しております。
Main.javaファイル

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package jfreechartclipboardtest;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import javax.swing.JFrame;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.plot.Plot;
import org.jfree.data.general.DefaultPieDataset;

/**
* 参考:http://www.javadrive.jp/jfreechart/ini/index3.html
* @author Cazper
*/
public class Main extends JFrame{

static JFreeChart chart;

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
Main frame = new Main();

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(10, 10, 400, 400);
frame.setTitle("グラフサンプル");

//クリップボードに描画する(ここではサイズを小さく指定)
CopyToClipboard(200,200);

//フレームを見えるようにします
//注意:この関数をCopyToClipboardの前に持ってくると変に表示されます
frame.setVisible(true);

}

/**
* コンストラクタ(パイチャートを作成してます)
*/
Main(){

DefaultPieDataset data = new DefaultPieDataset();
data.setValue("ジャイアン", 47);
data.setValue("スネオ", 31);
data.setValue("ノビタ", 22);

chart = new JFreeChart(new PiePlot(data));

Plot plot = chart.getPlot();
plot.setBackgroundPaint(new Color(192, 192, 192));

ChartPanel cpanel = new ChartPanel(chart);
getContentPane().add(cpanel, BorderLayout.CENTER);

}

//クリップボードに描画する(外部クラスを使わないのでstatic関数)
static public void CopyToClipboard(int width, int height) {
Toolkit kit = Toolkit.getDefaultToolkit();
Clipboard clip = kit.getSystemClipboard();
ImageSelection is = new ImageSelection(chart.createBufferedImage(width, height));
clip.setContents(is, null);
}

}


以下のファイルはクリップボードに画像をコピーするクラスが書かれております。
ImageSelection.javaファイル

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package jfreechartclipboardtest;

import java.awt.Image;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.ClipboardOwner;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;

/**
* 画像のコピーを行う
* http://www.ne.jp/asahi/hishidama/home/tech/java/clipboard.html
* @author Cazper
*/
public class ImageSelection implements Transferable, ClipboardOwner{

protected Image data;

/** コンストラクター */
public ImageSelection(Image image) {
this.data = image;
}

/** 対応しているフレーバーを返す */
public DataFlavor[] getTransferDataFlavors() {
return new DataFlavor[] { DataFlavor.imageFlavor };
//throw new UnsupportedOperationException("Not supported yet.");
}

/** フレーバーが対応しているかどうか */
public boolean isDataFlavorSupported(DataFlavor flavor) {
return DataFlavor.imageFlavor.equals(flavor);
//throw new UnsupportedOperationException("Not supported yet.");
}

/** 保持している画像を返す */
public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
if (DataFlavor.imageFlavor.equals(flavor)) {
return data;
}
throw new UnsupportedFlavorException(flavor);
//throw new UnsupportedOperationException("Not supported yet.");
}

/** クリップボードのデータとして不要になった時に呼ばれる */
public void lostOwnership(Clipboard clipboard, Transferable contents) {
this.data = null;
//throw new UnsupportedOperationException("Not supported yet.");
}

}

実行するとフレームは以下のように表示されます。

クリップボードに画像として書き込まれたグラフは以下のようになります。


諸々参考にしたサイト
StringSelectionクラスの作成
クリップボードへの転送
クラス java.awt.datatransfer.DataFlavor の使用
JFreeChartのグラフ処理

P.S.
ベクター画像(ベクトル画像)でクリップボードへコピーする

投稿者 cazper : 2009年1月28日 21:13 | b_entry.gif
     

トラックバック

このエントリーのトラックバックURL:
http://www.cazoo.jp/cgi/mt/mt-tb.cgi/2430

コメント