JavaでWMFを出力
高エネルギー物理学用のライブラリFreeHEPにベクトルグラフィクス用のコンポーネントがあり、これを利用するとJavaでWMF(ウィンドウズメタファイル)が出力できる。
ちょっと、試してみた。
■準備
FreeHEPの公式サイトから、FreeHEP VectorGraphicsをダウンロードして、クラスパスを設定。
■ソースコード
とりあえず、以下の様なプログラムを書いてみる。
package test; import java.awt.BasicStroke; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.Rectangle; import java.awt.Shape; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.geom.AffineTransform; import java.awt.geom.Line2D; import java.io.File; import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.List; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JPanel; import org.freehep.graphics2d.VectorGraphics; import org.freehep.graphicsio.emf.EMFGraphics2D; public class WMFTest extends JPanel{ /** * */ private static final long serialVersionUID = 1L; private List<Shape> sp; private boolean isPress=false; private Point pos0=null; private Point pos1=null; private BasicStroke stroke=new BasicStroke(2.0f); public WMFTest() { super(); super.setOpaque(false); sp=new ArrayList<Shape>(); MouseAdapter ma=new MouseAdapter(){ @Override public void mouseDragged(MouseEvent e) { if(isPress){ pos1=e.getPoint(); updateUI(); } } @Override public void mousePressed(MouseEvent e) { isPress=true; pos0=e.getPoint(); } @Override public void mouseReleased(MouseEvent e) { isPress=false; if(pos0!=null&&pos1!=null){ sp.add(new Line2D.Double(pos0.x,pos0.y,pos1.x,pos1.y)); } pos0=null; pos1=null; } }; addMouseListener(ma); addMouseMotionListener(ma); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2=(Graphics2D)g; g2.setStroke(stroke); g2.setColor(Color.RED); for(int i=0;i<sp.size();i++){ g2.draw(sp.get(i)); } if(pos0!=null&&pos1!=null){ g2.drawLine(pos0.x, pos0.y, pos1.x, pos1.y); } } void outputWMF(File f){ Rectangle r=getBounds(); try{ VectorGraphics vg=new EMFGraphics2D(f,new Dimension((int)r.getWidth(),(int)r.getHeight())); vg.startExport(); vg.setTransform(AffineTransform.getTranslateInstance(-r.getX(), -r.getY())); paintComponent(vg); vg.endExport(); }catch(FileNotFoundException fe){} } public static void main(String[] args){ JFrame f=new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.getContentPane().setBackground(Color.WHITE); f.getContentPane().setLayout(new BorderLayout()); final WMFTest wt=new WMFTest(); f.getContentPane().add(wt,BorderLayout.CENTER); JMenuBar bar=new JMenuBar(); JMenu menu=new JMenu("File"); bar.add(menu); JMenuItem out=new JMenuItem("Output WMF"); menu.add(out); out.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent arg0) { JFileChooser chooser=new JFileChooser(); int ret = chooser.showDialog(null, "ファイル選択"); if (ret != JFileChooser.APPROVE_OPTION) {return;} File file=chooser.getSelectedFile(); wt.outputWMF(file); } }); f.setJMenuBar(bar); f.setSize(800, 600); f.setVisible(true); } }