//************************************************************* // Javaアプリケーションの出力 // 「PlayerOutputTest」 // //          作 成 者:ルート高菜    //          作成開始月:2009/11 //          最終更新月:2009/11 [TN123/J113] //************************************************************* import java.awt.BorderLayout; import java.awt.Image; import java.awt.MediaTracker; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.jar.Attributes; import java.util.jar.JarEntry; import java.util.jar.JarFile; import java.util.jar.JarOutputStream; import java.util.jar.Manifest; import javax.swing.JButton; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.filechooser.FileNameExtensionFilter; public class PlayerOutputTest extends JPanel implements ActionListener { //Eclipseの場合、シリアライズ可能クラスでこれがないと警告が出る private static final long serialVersionUID=0; //------------------------------------------------------------------ // public static void main(String[] args) { JFrame frame=new JFrame(); frame.getContentPane().add(new PlayerOutputTest()); frame.setTitle("PlayerOutputTest"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //右上×印で終了 frame.setSize(450,400); frame.setVisible(true); frame.setLocationRelativeTo(null); //画面の真ん中に表示 } //------------------------------------------------------------------ // File fileImage; File filePlayer; Player player; // JTextField textImage=new JTextField(10); JButton buttonImage=new JButton("画像選択"); // JTextField textPlayer=new JTextField(10); JButton buttonPlayer=new JButton("Player指定"); JButton buttonOutput=new JButton("出力"); //------------------------------------------------------------------コンストラクタ // public PlayerOutputTest(){ // fileImage=filePlayer=null; // JPanel panelImage=new JPanel(); panelImage.add(textImage); panelImage.add(buttonImage); // player=new Player(false); // JPanel panelOutput=new JPanel(); panelOutput.add(textPlayer); panelOutput.add(buttonPlayer); panelOutput.add(buttonOutput); // setLayout(new BorderLayout()); add(panelImage,BorderLayout.NORTH); add(player,BorderLayout.CENTER); add(panelOutput,BorderLayout.SOUTH); // buttonImage.addActionListener(this); buttonPlayer.addActionListener(this); buttonOutput.addActionListener(this); } //------------------------------------------------------------------イベント // public void actionPerformed(ActionEvent e) { Object object=e.getSource(); if(object==buttonImage){ // //ダイアログ準備 JFileChooser chooser=new JFileChooser(fileImage); // if(chooser.showOpenDialog(this)==JFileChooser.APPROVE_OPTION){ fileImage=chooser.getSelectedFile(); textImage.setText(fileImage.getName()); // player.setImage(getImage(fileImage)); } }else if(object==buttonPlayer){ //ダイアログ準備 JFileChooser chooser=new JFileChooser(); chooser.addChoosableFileFilter(new FileNameExtensionFilter("JARファイル","jar")); chooser.setAcceptAllFileFilterUsed(false); //JARのみ選択可能 // if(chooser.showSaveDialog(this)==JFileChooser.APPROVE_OPTION){ filePlayer=chooser.getSelectedFile(); textPlayer.setText(filePlayer.getName()); } }else if(object==buttonOutput){ // if(fileImage==null){ JOptionPane.showMessageDialog(this,"画像を選択してください","エラー",JOptionPane.ERROR_MESSAGE); return; } if(filePlayer==null){ JOptionPane.showMessageDialog(this,"JARを指定してください","エラー",JOptionPane.ERROR_MESSAGE); return; } // outputPlayer(); } } //------------------------------------------------------------------ //JARで、起動可能なアプリケーションを出力する private void outputPlayer(){ try { //マニフェスト作成 Manifest manifest=new Manifest(); Attributes attributes=manifest.getMainAttributes(); attributes.put(Attributes.Name.MANIFEST_VERSION, "1.0"); attributes.put(Attributes.Name.MAIN_CLASS, "Player"); //そのマニフェストでJAR JarOutputStream jos=new JarOutputStream(new BufferedOutputStream(new FileOutputStream(filePlayer)),manifest); // copyPlayer(jos); //自身に入れてあるPlayer用のクラスを目的JAR内にコピー makeSettingFile(fileImage.getName(),jos); //画像を指定してある設定用のテキストファイルをJAR内に作成 copyImage(fileImage,jos); //表示させる画像をJAR内にコピー // jos.close(); // JOptionPane.showMessageDialog(this,"出力しました","完了",JOptionPane.INFORMATION_MESSAGE); } catch (IOException ioe) { JOptionPane.showMessageDialog(this,ioe.toString(),"エラー",JOptionPane.ERROR_MESSAGE); } } private void copyPlayer(JarOutputStream jos) throws IOException{ //ファイルを取り出す自分自身 JarFile jarSelf=new JarFile(System.getProperty("user.dir")+System.getProperty("file.separator")+"PlayerOutputTest.jar"); JarEntry playerEntryFrom=new JarEntry(Player.SELF_FILE); // BufferedInputStream bis=new BufferedInputStream(jarSelf.getInputStream(playerEntryFrom)); // JarEntry playerEntryTo=new JarEntry(Player.SELF_FILE); jos.putNextEntry(playerEntryTo); // int b; while((b=bis.read())!=-1){ jos.write((byte)b); } // jos.closeEntry(); bis.close(); } private void makeSettingFile(String info,JarOutputStream jos) throws IOException{ //エントリーを追加 JarEntry settingEntry=new JarEntry(Player.SETTING_FILE); // jos.putNextEntry(settingEntry); //内容 jos.write(info.getBytes()); // jos.closeEntry(); } private void copyImage(File image,JarOutputStream jos) throws IOException{ BufferedInputStream bis=new BufferedInputStream(new FileInputStream(image)); //エントリーを追加 JarEntry outEntry=new JarEntry(image.getName()); // jos.putNextEntry(outEntry); // int b; while((b=bis.read())!=-1){ jos.write((byte)b); } // jos.closeEntry(); bis.close(); } //------------------------------------------------------------------ //JAR外の画像を取得 private Image getImage(File image){ Image ret; // MediaTracker mt=new MediaTracker(this); ret=Toolkit.getDefaultToolkit().getImage(image.getPath()); mt.addImage(ret,0); try{ mt.waitForID(0); }catch(InterruptedException e){ return null; } // return ret; } }