javaでコマンドラインから実行する形だったプログラムsortFileをGUI化して、ボタンを押したら同じ処理を実行する、sortFile_v2を作ろうとしています。ざっくりいうとGUIのサンプルプログラム+sortFileという感じです。
もともとのプログラムは、「java sortFile フォルダ名」
を入力してもらうと、フォルダ内の音楽ファイルを調べ、更新日時順になるように名前の先頭を変更するというものです。
このプログラムをコマンドラインを使わずに実行できるよう、ウインドウから起動し、フォルダ選択を行い、sortFileと同じ処理したいです。sortFileのメイン処理をsortFile_v2の中で関数としてそのままコピーして持って来ています。ところが、sortFile_v2のsortFile()内
label.setText("表示される");は表示され、
label.setText("表示されない");からは表示されません。
java
1public class sortFile_v2 extends JFrame implements ActionListener{ 2 3 JLabel label; 4 5 public static void main(String[] args){ 6 /* ウインドウの表示 */ 7 JFileChooserTest2 frame = new JFileChooserTest2(); 8 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 9 frame.setBounds(10, 10, 500, 300); 10 frame.setTitle("sortFile-version2.0"); 11 frame.setVisible(true); 12 frame.LookAndFeelChange("windows"); // java風UIからwindows風UIに変更 13 14 15 } 16 17 /* ウインドウ表示とボタンの設定 */ 18 JFileChooserTest2(){ 19 20 JButton button_select = new JButton("フォルダ選択"); 21 JButton button_exec = new JButton("実行する"); 22 button_select.addActionListener(this); 23 24 JPanel buttonPanel = new JPanel(); 25 26 buttonPanel.add(button_select); 27 buttonPanel.add(button_exec); 28 29 label = new JLabel(); 30 label.setText("番号更新を行いたいフォルダを選択してください。"); 31 32 JPanel labelPanel = new JPanel(); 33 labelPanel.add(label); 34 35 Container contentPane = getContentPane(); 36 contentPane.add(labelPanel, BorderLayout.CENTER); 37 contentPane.add(buttonPanel, BorderLayout.PAGE_END); 38 } 39 40 public void actionPerformed(ActionEvent e){ 41 JFileChooser filechooser = new JFileChooser(); 42 filechooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); 43 44 int selected = filechooser.showOpenDialog(this); 45 if (selected == JFileChooser.APPROVE_OPTION){ 46 File file = filechooser.getSelectedFile(); 47 sortFile(file.getName()); 48 49 }else if (selected == JFileChooser.CANCEL_OPTION){ 50 label.setText("キャンセルされました"); 51 }else if (selected == JFileChooser.ERROR_OPTION){ 52 label.setText("エラー又は取消しがありました"); 53 } 54 } 55 56 public void sortFile(String args){ 57 class detail{ 58 File files; // ファイル 59 Date lastday; // 最終更新日 60 int order; // 順番 61 } 62 63 /* フォルダの存在確認 */ 64 File dir = new File(args); 65 label.setText(args); 66 67 /* 構造体配列の初期化 */ 68 File[] files = dir.listFiles(); // フォルダ内のファイルを配列に格納 69 label.setText("表示される"); 70 detail[] songFiles = new detail[files.length]; 71 label.setText("表示されない"); 72 73for(int i=0; i<songFiles.length; i++){ 74 songFiles[i] = new detail(); 75 songFiles[i].files = files[i]; 76 songFiles[i].lastday = new Date(files[i].lastModified()); 77 songFiles[i].order = 0; 78 } 79 80 /* 順番付け */ 81 for(int i=0; i<songFiles.length; i++){ 82 for(int j=0; j<songFiles.length; j++){ 83 if(songFiles[i].files.isHidden()) break; 84 if((songFiles[i].lastday.compareTo(songFiles[j].lastday) == 1)){ 85 if(!songFiles[j].files.isHidden()){ 86 songFiles[i].order++; 87 } 88 } 89 } 90 songFiles[i].order++; 91 } 92 93 94 /* ファイル名の変更 */ 95 for(int i=0; i<songFiles.length; i++){ 96 if(songFiles[i].files.exists() && !songFiles[i].files.isHidden()){ 97 String extention = songFiles[i].files.getName().substring(songFiles[i].files.getName().length()-4); 98 if(extention.equals(".mp3") || extention.equals(".m4a")){ 99 String str = dir.getName()+"/"+String.format("%02d", songFiles[i].order)+"-"+songFiles[i].files.getName().substring(4-1); 100 File fNew = new File(str); 101 songFiles[i].files.renameTo(fNew); 102 }else{ 103 System.out.println("対応していない拡張子が含まれています。ファイル名:"+songFiles[i].files.getName()); 104 } 105 }else{ 106 System.out.println("ファイルが存在しません。ファイル名:"+songFiles[i].files.getName()); 107 } 108 } 109 110 /* ファイル一覧の出力 */ 111 112 System.out.println("以下のファイル名を変更しました。"); 113 for(int i=0; i<songFiles.length; i++){ 114 115 if(!songFiles[i].files.isHidden()){ 116 String extention = songFiles[i].files.getName().substring(songFiles[i].files.getName().length()-4); 117 if(extention.equals(".mp3") || extention.equals(".m4a")){ 118 System.out.println(songFiles[i].order + " " + dir.getName()+"/"+String.format("%02d", songFiles[i].order)+"-"+songFiles[i].files.getName().substring(4-1) + " " + songFiles[i].lastday); 119 } 120 } 121 } 122 } 123 124 public void LookAndFeelChange(String look){ 125 /* windows風UI 例外処理 */ 126 try{ 127 if(look.equals("windows")){ 128 UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); 129 }else if(look.equals("motif")){ 130 UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel"); 131 }else{ 132 UIManager.setLookAndFeel("com.sun.java.swing.plaf.metal.MetalLookAndFeel"); 133 } 134 }catch(UnsupportedLookAndFeelException e){ 135 }catch(ClassNotFoundException e){ 136 }catch(InstantiationException e){ 137 }catch(IllegalAccessException e){ 138 } 139 } 140 141}
detail[] songFiles = new detail[files.length];のところでプログラムが止まってしまっているのかなと思っていろいろ変えたり調べたりしましたが、うまくいきませんでした。
label.setText("表示されない");以降はまだ何も手を加えていないので、printlnなどが残ったままです。
アドバイスをいただけるとありがたいです。
もし情報が不足している場合は補足しますので、それも教えていただけるとありがたいです。
環境:java 1.8.0_261
確認できていること:
・filesには選択したフォルダ内のファイルが入っており、files.lengthは正しい値が返される。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/12 00:18
2020/08/12 13:19