質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

1回答

702閲覧

Java GUI ボタンを押して実行すると処理が途中で止まってしまう

momoka_sumikko

総合スコア7

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2020/08/11 13:46

編集2020/08/12 01:03

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は正しい値が返される。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

java

1 File[] files = dir.listFiles(); // フォルダ内のファイルを配列に格納 2 label.setText("表示される"); 3 detail[] songFiles = new detail[files.length]; 4 label.setText("表示されない");

sortFile()にはファイル名しか渡していない。dirにはディレクトリが指定されていない。だから、listFiles()がnullを返す。filesは、null。files.lengthで、NullPointerExceptionが発生。だから「表示されない」は表示されない。StackTraceが出ていると思いますけどね。少なくともわたしのところでは出力されています。

ということで、選んだディレクトリをgetName()せずに、そのまま渡せばいい。きっと。

diff

1diff --git a/src/main/java/JFileChooserTest2.java b/src/main/java/JFileChooserTest2.java 2index b8fa538..e924673 100644 3--- a/src/main/java/JFileChooserTest2.java 4+++ b/src/main/java/JFileChooserTest2.java 5@@ -51,7 +51,7 @@ public class JFileChooserTest2 extends JFrame implements ActionListener { 6 int selected = filechooser.showOpenDialog(this); 7 if (selected == JFileChooser.APPROVE_OPTION) { 8 File file = filechooser.getSelectedFile(); 9- sortFile(file.getName()); 10+ sortFile(file); 11 12 } else if (selected == JFileChooser.CANCEL_OPTION) { 13 label.setText("キャンセルされました"); 14@@ -60,7 +60,7 @@ public class JFileChooserTest2 extends JFrame implements ActionListener { 15 } 16 } 17 18- public void sortFile(String args) { 19+ public void sortFile(final File dir) { 20 class detail { 21 File files; // ファイル 22 Date lastday; // 最終更新日 23@@ -68,8 +68,7 @@ public class JFileChooserTest2 extends JFrame implements ActionListener { 24 } 25 26 /* フォルダの存在確認 */ 27- File dir = new File(args); 28- label.setText(args); 29+ label.setText(dir.getAbsolutePath()); 30 31 /* 構造体配列の初期化 */ 32 File[] files = dir.listFiles(); // フォルダ内のファイルを配列に格納

投稿2020/08/11 14:12

shiketa

総合スコア3971

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

momoka_sumikko

2020/08/12 00:18

回答していただきありがとうございます。 教えていただいた通り修正してみましたが、相変わらずdetail[] songFiles = new detail[files.length];以降は実行されていないみたいです。 files.lengthは4つファイルがあるフォルダを選択すると4が入っていることが確認できたので、そこはちゃんと動いていると思います。 まだ何か考えられる解決策があれば、よろしくお願いします。
shiketa

2020/08/12 13:19

IDEというものがあります。IntelliJとかEclipseとかNetBeansとか。IDEにはデバッガがついています。デバッガを使うとブレークポイントを設定できます。ブレークポイントを設定して、ワンステップずつ進めたり、変数の内容を確認することができます。便利ですので使ってみてはいかがでしょうか。https://www.google.com/search?ei=UOszX6O0A5el-Qb1yLHwBA&q=ide+breakpint+debug+java&oq=ide+breakpint+debug+java&gs_lcp=CgZwc3ktYWIQAzoGCAAQDRAeOgcIIRAKEKABOgQIIRAVUPgoWOwxYIszaABwAHgAgAGPAYgBwAWSAQMwLjaYAQCgAQGqAQdnd3Mtd2l6wAEB&sclient=psy-ab&ved=0ahUKEwijnNnK35XrAhWXUt4KHXVkDE4Q4dUDCAw&uact=5
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問