質問: javaのSwingを使ったGUIプログラミングに挑戦しています。 Swingはまだ初心者であまりやったことありません。 最初に画像を表示してそれを動かすプログラムを組みたいです。 まず考えてみたのはPNG形式の画像からImageIconクラスのオブジェクトを作成し、 ラベルのコンストラクタの引数に指定する方法ですが画像がうまく表示されません。 画像のデータを入れるファイルのパスはどこを基準として入力していいのかわかりません。 classファイルがあるところでいいのでしょうか。 またこの方法で作りたいプログラムを組めるのでしょうか。
回答: 他のGUIライブラリー(Windows FormアプリとかJavaFXとかその他)には画像を表示するためのずばりのビューがImageViewなんて名前で用意されてます。 しかしswingにはそういうものがないため、よくサンプルでJLabelのアイコンとして画像を設定して表示するなんて方法が紹介されていたと思います。 自分は「アイコンのつもりじゃない」のでそういうことはあまりせずJComponentのpaintComponentメソッドでg.drawImage(...)で画像を描画するような手法を好みます。 しかしまぁそんな細かいことは気にせず画像が表示できればいいじゃないということでJLabelを使っても一向に構わないと思います。 > > 画像のデータを入れるファイルのパス > > > 絶対パスで指定すれば任意の場所が指定できます。これが一番混乱しないかも知れません。 もし表示したい画像が固定的ならパッケージディレクトリーと同じ階層において `Class#getResource("/com/ksoh/xxx.jpg")` なんてしておくと手軽で分かり易いです。jarに纏めた後でも纏める前でも同じように動いてくれますので。 一方アプリケーションが動いたときの作業ディレクトリー相対でアクセスしようとすると若干混乱するかも知れません。 例えばIntelliJやEclipseで実行するとプロジェクトディレクトリーを作業ディレクトリーとして動くのでその直下に置いたファイルなら"./xxx.jpg"でアクセスできますが、jarに纏めてからjarを起動するとjarが入っているディレクトリーが作業ディレクトリーになったりします。動かし方によって作業ディレクトリーが様々に変わるのでどこで動いているかに注意してコードをかかないといけないのですね。 ちなみにどこで動いているかを調べる簡単な方法があります。`System.getPropsert("user.dir")`とやると今プログラムがどのディレクトリーで動いているかがわかります。