« 為替FX?いやいやJavaFX |
メイン
| 大きい政府だって万能じゃない »
2009年1月28日
【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
|
トラックバック
このエントリーのトラックバックURL:
http://www.cazoo.jp/cgi/mt/mt-tb.cgi/2430