また回答の方で失礼します(地味に使いにくい qiita の質問)
なんで出力できたのかがわかりません。どう調べればいいのかもわからずモヤモヤが残っています。
直接的に変更した部分は、
- 「画像フォーマットを Java で扱えるものに変換したこと」
- 「ファイルの指定を正しいものに変更したこと」
ですが、途中で色々コード変えちゃいましたね。
私が問題を特定するまでの整理をしてみます。
問題個所の最初の状態は、こうでした
JLabel jlImage = new JLabel(new javax.swing.ImageIcon("歩行ドットキャラ.psd"));
とりあえず、JLabel は import して使っているのに、
ImageIcon は import されていないようだったので追加しました。
(これは単にソースコードの見栄えの問題です)
// import javax.swing.ImageIcon; を追加
JLabel jlImage = new JLabel(new ImageIcon("歩行ドットキャラ.psd"));
問題解決する際には、複数の処理が一文に纏まっていると、
どこがおかしいのかわからなくなりがちなので、
文を分けました。
ここまではやっていること自体は変わりません。
// まず、ImageIcon を生成して、
ImageIcon icon = new ImageIcon("歩行ドットキャラ.psd");
// icon を設定した JLabel を作る。
JLabel jlImage = new JLabel(icon);
コンパイル時にエラーが出ていないので、文法は問題ないはず。
何がおかしいのだろうと考えて、いくつか当たりを付けました。
- ファイルが読み込めていない (可能性1)
- ファイルは読み込めても、画像フォーマットが対応していない (可能性2)
で、実際に手元でわざと、間違ったファイル名や、
画像でないファイルを読み込ませてみました。
画像は表示されず、エラーも出ない、という似たような状況を再現できました。
ですが、エラーが出ていないので、
どちらが問題なのか(あるいは両方か)特定できません。
ここで、ImageIcon の API を調べに行きます。
(実際にはある程度事前に知っていた、のですが)。
ImageIcon (Java Platform SE 8 )
説明文に、
サポートされているGIF、JPEG、PNG (1.3以降)などのイメージ形式
と書かれているので、まず psd ではだめなようです。
なので最初に png 等に変換してみては?、とコメントしました
// psd → png に変換してみる
// 変換したファイルを読み込むように変更
// ImageIcon icon = new ImageIcon("歩行ドットキャラ.psd");
ImageIcon icon = new ImageIcon("歩行ドットキャラ.png");
JLabel jlImage = new JLabel(icon);
それでも変わらず、と言うことなので、
問題を特定する方向に変更しました。
ImageIcon (Java Platform SE 8 )を見てみると
ImageIcon には、「ファイル名」ではなく「画像データ(Image)」から作成する方法もあります。
画像データを自力で読み込むようなコードに変換すれば、
間違いがあれば、そこでエラーが出る(問題を特定できる)だろうと考えて、
コード書き直しました。
// 必要な import 文は適宜追加
try {
// ファイルオブジェクトを作成して
File file = new File("歩行ドットキャラ.png");
// 画像データ (BufferedImage) を読み込む
BufferedImage image = ImageIO.read(file);
// 画像データから ImageIcon 生成
ImageIcon icon = new ImageIcon(image);
// 略
} catch(IOException e) {
// ファイル読み込みに問題がある
} catch(NullPointerException e) {
// 画像フォーマットが対応していない
}
で、試していただいたところ、IOException の方だったので、
じゃあファイルの指定がおかしいね、
ファイルの位置を変えるか、ファイル名の指定を変えよう
と言うことになるわけです。
ImageIO.read
で画像データ (BufferedImage
) が読み込めるのはどこで調べるのか、
と言う話なのですが、
これに関しては「前に使ったことがあって知ってたから」になってしまいますね...。
Java で画像処理などを行う際に使用します。
キーワードとしては Java2D
とか。
独学で進めているため、解説や問題が起きた時の調べ方も最後に教えていただけると後学のために助かります。
中々難しい話ですが、あくまで私個人の考えとして。
一般的な話としては、まず問題を分割して考えることでしょうか。
変数等分けて、どこまでは大丈夫なのか確認する。
また「今のコード」を弄るのではなくて、
「問題が発生する部分」だけを抜き出した、より小さなプログラムを作ってみるのも手です。
検討しやすくなりますし、それで問題が発生しなければ他の部分に疑いを向けることができます。
勉強中ということであれば、まず動くプログラムを入門書などから持ってきて、
目的のものになるように変更していく、というのも良いかと思います。
問題が起きても、何を変えたときに問題起きたのか特定しやすいので。
まあ、入門書のプログラムがまず動かせない、とかいうことも往々にしてありますが...。
ある程度、その言語に習熟した後ならば、デバッガの使い方覚えると楽ですかね。
調べると言う部分では、やはり正式なリファレンスを参照すること、でしょうか。
Java SE API &ドキュメント | Oracle 日本
ただ、Java の場合ちょっと面倒なのですが。
- 日本語の資料は追加が遅いので最新版だと「無い」ことがある。
- Java 9 以降モジュールシステムが導入され、API ドキュメントもモジュールに分かれてしまったので、関連するものを探すのに結構コツが要る。
- 例えば swing 関連は
java.se
→ java.desktop
と辿って行かないと見つけられません。
- 検索機能を活用すれば、多少マシにはなります。
私は Java 8 の頃の古い資料見てしまうことが多いです。
(あまりよくはないですが、変わっている可能性を考慮した上で)
他に鉄板の方法としては「エラーメッセージでググれ」なのですが、
今回はメッセージが出ない厄介なケースでしたからね。
Qiita で質問、が大正解なのかも?
ただ、今回ソースコードが崩れてしまっているので、
スルーされがちかもしれません。
Qiita の markdown 記法を便利そうなところだけ覚えて、
コードが見やすいようにしておくと、
回答が付きやすいかなと思います。
Markdown記法 チートシート - Qiita
\`\`\`言語
コード
コード
コード
\`\`\`
Java の場合
\`\`\`java
public class MyClass {
public static void main(String[] args) {
System.out.println("Hello!");
}
}
\`\`\`
↓表示
public class MyClass {
public static void main(String[] args) {
System.out.println("Hello!");
}
}