怒りのJava学習 このページをアンテナに追加 RSSフィード

Java初心者が
Java学習の途中で感じた怒りを
叩きつけるブログ

 このブログでは
※コンパイルエラーの99%は入力ミスで出来ています
※コンパイルエラーの1%は故意の省略で出来ています

現在皆様のエラー例を募集中



↓このブログの執筆方針
はじめに

↓ブログランキングへのリンク

クリックでランキングのポイントが加算される
今のところどうでもいい

2009-06-07 いまだ謎は残るわけだが

[][]jarが無い!


 さて、昨日なぜjarファイルへの操作の途中で実験せず「つづく」としたかと言えば、

jarが無い!

 からに他ならない。

 あれ〜?コンパイルしたら自動的にjarファイルがプロジェクトフォルダ直下のdistフォルダに入ってるんじゃないのか?jarどころかdistファルダすら見当たらないんだけど・・・。おっかしいなぁ。以前(NetBeans6.0.1)は何もしなくてもjarファイルが生成されていたのに・・・。NetBeans6.5だと仕様が変わったのかなぁ?


 NetBeansのヘルプで「jar」を検索っと・・・。

JAR ファイルの構築

では、「構築」コマンドまたは「生成物を削除して構築」コマンドを実行するたびに、IDE はプロジェクトのソースから JAR ファイルを構築します。JAR ファイルは、プロジェクトフォルダの dist ディレクトリに生成されます。

ええ〜!?じゃあ実行してみよう。・・・やっぱりdist無いよ!

(上のつづき)

「構築」コマンドは、プロジェクトの「保存時にコンパイル」コマンドが有効な場合には無効になります。ファイルの保存時にファイルはコンパイルされますが、JAR ファイルはクラスファイルの新しいバージョンを使用して再パッケージ化されません。プロジェクト全体の生成物を削除して構築せずに JAR ファイルを再構築できるようにする場合、プロジェクトの「保存時にコンパイル」を無効にし、「構築」コマンドを使用します。

ほほう、そうだったのか。しかしこれおかしくないか?保存時にコンパイルするか否かとjarファイルにパッケージ化するかどうかは別の事じゃないか?とにかく早速無効にしてみよう。・・・やっぱりdist無いよ!

 おかしいなぁ・・・最近はいつも「ファイルを実行」ボタンで実行してたからかなぁ?じゃあ、「主プロジェクトを構築」してみるか。(「主プロジェクトを実行」では出ません。)

 おお!出たっ!


 ・・・これおかしくないか?「ファイルを実行」もコンパイル(つまり構築)してから実行してるはずだよな?じゃあ「構築」するのとおんなじだと思うんだが。・・・いや、いつも使ってるボタンはフォーカスが合ってるファイルのみを単独実行っていうボタンだからプロジェクト全体のコンパイルはしてないんだよな。(以前似たような事があったような。)なるほど”プロジェクト”を対象にしないと駄目なんだな。


 さて、問題は、jarファイルを作る時のネイティブライブラリの付け加え方なのだが・・・まさか、</project>の直前に「TODO」を加えてもうまく行くとは思えない。(試しました。「主プロジェクトを実行」すら出来なくなりました。)

 では何を加えればいいのだろうか?


 というところで本日は寝る。

----------------------------------------------

6月12日追記

 何を加えればよいかについては、6月4日のたけチンさんのコメントによって

「単純に書きかけのテキストなので、この部分を完成させよという意味で「TODO」というコメントを付けている」

という衝撃の事実が判明。よってXMLの知識がない俺には現時点では自動化処理は不可能ということが分かった。手動で頑張りましょう。

2009-02-23 こんな初歩的なバグってあるのね

[][]プロジェクト越しのクラスコピーの怪


単純なことである。

NetBeansで、

適当にプロジェクトを二つ作って、一方に適当にクラスを作る。

package copytest1;

/**
 *
 * @author java1rou
 */
public class CopyTest1 {

    public CopyTest() {
        //it's constrauctor
        //これはコンストラクターです。
    }
}

そのクラスに日本語でコメントする。もしくは、日本語を文字リテラルにする。

で、もう一方にそのクラスをコピーする。リファクタリングコピーでも、ただのコピーでもよい。

すると、日本語が文字化けする!

package copytest2;

/**
 *
 * @author java1rou
 */
public class CopyTest1 {

    public CopyTest1() {
        //it's constrauctor
        //縺薙l縺ッ繧ウ繝ウ繧ケ繝医Λ繧ッ繧ソ繝シ縺ァ縺吶?
    }
}

ただし、同じプロジェクト内でのコピーではこれは発生しない。

また、windowsVISTAでは発生したが、windowsXPでは起きなかった。後は知らない。


既に報告されてるバグかも知れないと今気づいたが、面倒なので検索しない。

2008-10-09 なんだか検証すべき事項が増えて混乱してきた

[][]JTableに画像を2



昨日の記事(NetBeansでは画像が表示されないがコマンドラインで表示できた)で、きしだ氏のコメントと同じ事を、隣に座っている友人に指摘された。

いわく、「./を付けると、コマンドプロンプトで実行したらその時のカレントディレクトリが相対パスの起点になる」というのだ。実行されたファイルがどこにあるか、ではなく、どこでファイルを実行したか、によるのだと言う。


耳を疑ったね。


だってそうだろう?HTMLでそんなルール聞いたことある?


ネーよ!


HTMLはどこで誰が呼び出そうとも、相対パスの起点は呼び出されたHTMLファイルのあるディレクトリだ。例えばフレーム(画面分割)を指示するHTMLで別のHTMLを呼び出して、更にそのHTMLが画像やHTMLを呼び出しても、二つ目のHTMLに書かれた相対パスの起点となるのは二つ目のHTMLの有る場所になる。(CGIとかはまた別だが。)


そういう固定概念のせいでえらい遠回りをしたぜ。


しかしそういう大事なことはちゃんと書いてくれよ入門書!


と思って手元の入門書を片っ端からめくってみるが、絶対パスと相対パスとが確かに書いてある本もあるがファイル同士の位置関係に対する書き方を解説してるだけで、コマンドプロンプトでの実行時ディレクトリへの注意とか、NetBeansではどうするんだ?とかの情報は書いてない。

まあ、そもそもNetBeansを扱ってる本が「創るJava」だけなので書いて無くてもしょうがないのかも知れないが。

絶対パスと相対パスについて書いてないという信じられない本もある。「本格学習Java」キミの事だよ。目次にも索引にも無いぞ。まあ、コイツは画像を扱ってないし、NetBeans使ってないからいいのかもしれんが。

しかし「創るJava」にも書いてない。おいおいじゃあ昨日のような問題はNetBeansでどう処理させてるんだ?って思ったら画像ファイルは常に絶対パスでアドレスを指定してました。ぎゃふん。

eclipsではどうなってるんだろう?eclips使ってないし、本も持ってないからわからない。


さて、NetBeansから動かす時の相対パスの書き方はわかった。

なるほど、プロジェクトフォルダを起点にすればいいのね〜。*1

うむ、成功した!

f:id:java1rou:20081011042647j:image

なお、実験してみたところ、NetBeans上で実行したときは「./」が無くてもプロジェクトフォルダ直下から探し始めるようです。そしてjarファイルを一つ上のディレクトリから実行しても「./」無しの相対パスの画像は表示されず、imgフォルダを上の階層に引き上げると表示されました。


つまり、ここまでの実験において、「./」有る無しの差は認められませんでした。

もう面倒だからプロジェクトフォルダにimgフォルダを作ってそこに画像を置いておこう。これならソースを書き換える必要もないし。(HTMLでもそういうディレクトリ構成をしているサイトを良く見かける。HTML用のIDEも似たような仕様なのだろうか?それともそれ以前にこうする慣習がプログラミングの世界に出来上がっているのだろうか?そういう慣習をまとめた本って無いかなァ・・・。その内探しておこう。)


さて。


・・・問題はjar内部の画像にアクセスする方法だ。これがわからん。jarファイルを解凍すると

プロジェクト名\パッケージ名\img\japan.gif

てな感じでフォルダとファイルが出てくる。この相対パスでjapan.gifを表示しようとしてもダメ。jarファイルのあるフォルダに解凍したモノが置いてあると表示されちゃったりするがそれじゃあダメだろう。jarファイル内部のデータを使わなければ意味が無い。

パッケージ名\img\japan.gif

img\japan.gif

japan.gif

としてもダメ。

jarファイルをダブルクリックしてもコマンドプロンプトから起動しても画像が表示されない。ソースをいじってもプロジェクト内のimgフォルダの位置をいじってもダメ。

どうすりゃいいのッ!?

(という訳で→翌日の記事に続く)

*1:しかしこの機能、コマンドライン入力の時には当然だとしても、クラスファイル内で記述されているときは実行時ディレクトリじゃなくて読まれているクラスを起点にしてくれないかなぁ・・・HTMLの相対パスと同じに。

2008-10-08 HTMLの簡単さがなぜ実現できない!?

[][]JTableに画像を1



 作ろうとしているゲームとは違う話なのだが、Javaでテープル(表)に画像を縦横に表示するアプリケーションを作る必要が出てきた。

 大量の画像かつ欠損がある可能性があるから、ただ並べただけでは画像の並び方に不具合が出る可能性があるのでやっぱりテープルが望ましい、と思う。

 HTMLの経験から、テーブルのセル(エクセルのセルと似た概念)に画像を表示するのは簡単だろうと思ったのだが、甘かった!



 まず、手元の初心者用入門書を読んでも方法が書いてない。

 googleで”java table 画像”で検索してみる。

イヌでもわかるJavaScript講座

四季でテーブルの背景画像(計4枚の画像)が変わるjavascriptとHTML内 ...

アクセス毎に画像表示を変えるJavaスクリプトの設置方法。ホームページ ...

雛形倶楽部情報データベース [データ詳細]

JavaScript:画像拡大表示ライブラリ「PopBox」、HTMLのテーブルより ...

TABLEの背景画像をCSSに変更したい。 -OKWave

Child Tree (HP Q&A BBS) [One Thread Res View / javascriptの ...

透けるテーブル table を作る-ホームページ作成の大技と小技

スクロールバーに画像

おしえてBP! 縮小画像をマウスオーバーで画像を切り替えるjava ...

 全部JavaScriptだよ!どうすりゃいいんだ!?



 やっと13件目で

http://java-house.jp/ml/archive/j-h-b/045696.html:title=[JavaHouse-Brewers:45696] JTable における画像表示が出来ない]

getClass(); } } こんな感じでテーブルに画像を表示させようとしました。 ところが、 実際に画面を起動すると、Javaコンソール画面にjava.security.AccessControlException : access denied (java.io. ...

 が、やっとHIT。しかし意味がよく分からない。

・・・ってググり方が悪かったようだ。”java JTable 画像”で再度検索。(画像もってくるのはめんどくさいので省略)

#

java JTable 画像 のイメージ検索結果

- 画像を報告この中に不快/不適切な画像がある場合: 報告 キャンセルご報告いただきありがとうございます。

画像1画像2画像3画像4

文字列以外のデータをテーブルに表示する - JTableクラス - Swing

ImageIcon icon = new ImageIcon("画像ファイル名");. 国旗のアイコンは『世界の国旗アイコン』を使わせて頂きました。 まずはJTableのコンストラクタに渡すデータに、 画像も含めて試してみます。

 有望そうだ。画像の一つ目をクリック。おう!テーブルのセルに画像が貼り付けられている例がある!ソースファイルはどこだ!?

 ・・・無い。どういうサイトなんだここ?・・・英語だし、メンドクサイ上にソースファイル無いなら時間の無駄だから調査はしないで撤退。

 日本語の検索結果の一つ目を見てみる。・・・おお!これは先日発見したサイトJavadriveではないか!期待大!

{new ImageIcon("./img/japan.gif"), "日本", "3勝", "0敗", "1分"},

 ほほう、こうやってtableデータを定義するのか。簡単そうだな!と思ったらこれはマチガイの例らしい。

この理由なのですが、JTableは各セルを表示する際に、TableModelで定義されている"getColumnClass"メソッドを使って、その列のクラス名を調べるようにしているようで

本来は引数で指定した列に定義されているクラス名を返せばいいのですが、引数がなんであれ"Object"クラスを返すようになっています。

これを修正するにはDefaultTableModelクラスを継承し、"getColumnClass"メソッドをオーバーライドしたクラスを用意して利用するようにします。

 これってつまり不具合なんじゃね?getColumnClassって言うならちゃんとクラス名を返さなきゃだめだろ!?それが常にObjectを返すだなんてあきれてモノも言えねぇ。HTMLの簡単さを見習え!セル内部に<IMG="URL">というタグを入れるだけで表示出来るんだぜ!?HTMLより何年も後に出て改良が重ねられてるJavaで何でこんな手間を掛けなきゃならないんだよ!これじゃHTMLよりも低級言語だぞ!(あ、モノ言っちゃった。)


 まあそれはともかく、とにかくこれの対処法を丁寧にソース解説してくれてるので、さっきのメーリングリストの回答もすっきり理解できた。

 ちゃんと動くソース全体も記述されているので喜んで丸ごとNetBeansに新しくTestTableプロジェクト作ってコピペしてメインファイルにする。画像は同じディレクトリのimgフォルダにまとめておけばよさそうだ、というわけでソースファイルに直接コピペ。できたー!ラクチンラクチン!

 よーし、とりあえずNetBeans上でメインクラスを実行してみよう。

f:id:java1rou:20081009024747j:image


 ・・・なんでやねーん。


 あれ?コレと似たこと前にも無かったかなァ?

 ああ、アレだ、テクスチャー貼り付け不能事件だ。まさかアレとおんなじ結果にならないだろうな・・・。


 と思ったら全く同じ結果になった。クラスファイルの周辺にどんなにガンバって画像を配置してもNetBeans上で実行する限り画像が現れることは無く、jarファイルと同じフォルダに配置してしかもコマンドプロンプトから実行して初めて画像がアプリ上に現れる。

f:id:java1rou:20081009024746j:image

 今回は更に追加実験で、クラスファイルをコマンドプロンプトから実行してみた。

 こっちも成功。imgファイル内からgifファイルを移動させて実行すると失敗することから両方とも実行ファイルのあるフォルダにあるimgファイルを読むようだ。


 と、思ったらそうではないのだった!


(翌日の記事に続く)

2008-10-07 しかしあらかじめ0が入るのも危険な気がする

[]補完に( ゚Д゚)ポカーン


System.e

まで打つと

exit(int status) void

と補完候補を挙げてくれるのはいいとして、それを選ぶと

System.exit(WIDTH);

となるのは勘弁してくれないかなァ・・・。exitの引数は0か1でしょ?



もしかしてint型の引数は全部WIDTHって入っちゃうのかね?


・・・アホ。