- ベストアンサー
JAVA初心者のエラー原因と警告の原因は?
- JAVA初心者が気になるエラーの原因と警告の原因について解説します。
- エラーが出るコードの原因や警告が出るコードの原因を解説します。
- JAVA初心者がエラーと警告について理解するための解説をします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> WindowAdapterをaddWindowListener()に渡している場合には、WindowListenerの実装は不要になるのでしょうか。 書き方がいくつかあるのです。今回のコードを例に挙げます。 1つ目はJFrameTestクラスがWindowListenerを実装し、addWindowListener(this)という形でJFrameTestクラス自身をイベントリスナとして登録する方法。この場合はクラス名定義のところにimplements WindowListenerと書いてWindowListenerをこのクラスで実装することを宣言し、WindowListenerのabstractメソッドをこのクラス内ですべて実装します。 2つ目はWindowListenerを別のクラスで定義する方法。例えば class MyWindowListener implements WindowListener という宣言でクラスを作り、WindowListenerのメソッドをこのクラスで実装し、JFrameTestクラスでは MyWindowListener listener = new MyWindowListener(); addWindowListener(listener); のようにしてイベントリスナを指定します。この方法だとMyWindowListenerクラスは他のプログラムでも使える、といった利点があります。 3つ目はアダプタクラスを使う方法。 class MyWindowAdapter extends WindowAdapter というクラスを作り、「使いたいメソッドだけ」実装して、MyWindowAdapterクラスのオブジェクトをイベントリスナとして登録します。アダプタクラスは、対応するリスナインターフェースの使わないabstractメソッドを実装する手間を省いてくれるものです。 4つ目は、アダプタクラスを使いたいのだけれどもわざわざクラスを分けて書きたくないときの簡易的な書き方。それがaddWindowListener(new WindowAdapter() { … という書き方です。ここでのnew WindowAdapter(){}のような書き方は、固有の名前を持たないクラスの定義なので無名インナクラスと呼ばれます。 他にもやり方があるかもしれませんが、要は複数の書き方ができる中でどれか1つを使えばいい、ということです。1つのクラスに対して上記の中から複数のやり方を採用したときの動作がどうなるかは分かりません(優先順位があるかもしれないし、動作不定になるかもしれません)が、1つのやり方で書けば充分なのです。 このあたりは参考書によりますが、普通はWindowListenerを実装する書き方を先に解説し、別の方法として無名インナクラスを使う方法が紹介されていると思うのですが。 > #APIのサイトに行きました。 > しかし、下のような内容で同じ見出しで6種類の内容があり、また、「推奨されていません」とは書かれてはいますが、どう書けというコメントも見当たらないのですですが、、、、、 > このコマンドは変更したので、どのように書けと簡単に書いてくれてれば分かり易いのにと考えてしまい、ついつい掲示板に質問してしまいます。 前回紹介したリンクを見てみましたか? 下記のページに繋がっているはずです。 http://java.sun.com./javase/ja/6/docs/ja/api/java/awt/Window.html#show() ここに「推奨されていません。 JDK version 1.5 以降は、setVisible(boolean) に置き換えられました。」とはっきり書かれていますよね。 つまりshow()をsetVisible()に置き換えればいいんです。setVisible()は引数にbooleanを取りますが、その意味はさらにsetVisible()を調べれば分かるはずです。ちなみにこの場合はshow()の代わりにsetVisible(true)に書き換えれば警告は出なくなります。 どうもお返事を見るとshow()というメソッド名で検索したようですが、それでは関係のないクラスのshow()まで出てきてしまうので混乱してしまうでしょう。自分が使っているクラスから順にたどっていく方が正解にたどりつきやすいですよ。
その他の回答 (1)
- komi1341
- ベストアンサー率65% (25/38)
まず質問の仕方を勉強してください。 http://www.hyuki.com/writing/techask.html 「エラーが出ます」ではなく、エラー文そのものを載せてください。 私のところでは下記のエラーが出ましたが、 > JFrameTest.java:8: JFrame_Ohayou は abstract でなく、java.awt.event.WindowListener 内の abstract メソッド windowDeactivated(java.awt.event.WindowEvent) をオーバーライドしません。 > class JFrame_Ohayou extends JFrame implements WindowListener{ インターフェースを実装するときは、abstract宣言されているメソッドをすべて実装しなければいけない、というのはご存知ですか? このプログラムはWindowListenerを実装しているのですが、WindowListenerのabstractメソッドの1つであるwindowDeactivated()が実装されていないためにこのエラーが出ているのです。このあたりはインターフェースについて参考書で調べれば載っていると思います。またどのインターフェースにどんなabstractメソッドがあるかはAPIリファレンスで確認できます。 http://java.sun.com./javase/ja/6/docs/ja/api/index.html ちなみにこのプログラムの場合、WindowAdapterをaddWindowListener()に渡しているので、WindowListenerの実装自体不要です。つまりimplements WindowListenerの部分は削除してしまっていいということです。アダプタクラスについては参考書のイベント処理関連の章に載っていると思います。 > また、最後の「j.show();」では警告が出ています。 これもAPIリファレンスで確認できますが http://java.sun.com./javase/ja/6/docs/ja/api/javax/swing/JFrame.html ここの「クラス java.awt.Window から継承されたメソッド」の中にshow()があり、そのリンク先にJDK1.5から推奨されなくなったと書いてあります。代わりにどう書けばいいかもAPIリファレンスを読めば書かれています。 またわざわざこのような場で質問しなくても、エラーメッセージで検索すれば解決策が見つかることが多いです。APIリファレンスを読むこととエラーで検索すること、は自分で勉強するために癖をつけることをお勧めします。
お礼
回答有り難う御座います。 APIリファレンスがあるのは知ってはいるのですが、開き直っている訳ではないのですが、初心者にとってはチンプンカンプンです。 仕方なく参考書を調べながらになってしまいます。 >ここの「クラス java.awt.Window から継承されたメソッド」 #APIのサイトに行きました。 しかし、下のような内容で同じ見出しで6種類の内容があり、また、「推奨されていません」とは書かれてはいますが、どう書けというコメントも見当たらないのですですが、、、、、 このコマンドは変更したので、どのように書けと簡単に書いてくれてれば分かり易いのにと考えてしまい、ついつい掲示板に質問してしまいます。 ================================================== show() - class java.awt.Component のメソッド 推奨されていません。 JDK バージョン 1.1 以降は、setVisible(boolean) に置き換えられました。 show() - class java.awt.Window のメソッド Window を表示します。 show() - class java.awt.Dialog のメソッド Dialog を表示します。 show() - class javax.swing.JInternalFrame のメソッド この内部フレームを表示し、前面に移動します。 show() - class javax.swing.plaf.basic.BasicComboPopup のメソッド ComboPopup.show() の実装です。 show() - interface javax.swing.plaf.basic.ComboPopup のメソッド ポップアップを表示します。 =======================================================
補足
komi1341さん、回答有り難うございます。 >ちなみにこのプログラムの場合、WindowAdapterをaddWindowListener()に渡しているので、WindowListenerの実装自体不要です。つまりimplements WindowListenerの部分は削除してしまっていいということです。アダプタクラスについては参考書のイベント処理関連の章に載っていると思います。 # WindowAdapterをaddWindowListener()に渡している場合には、WindowListenerの実装は不要になるのでしょうか。 実は色々と参考書等を調べたのですが、「インターフェースを実装するときは、abstract宣言されているメソッドをすべて実装しなければいけない」との解説はありますが、「WindowAdapterをaddWindowListener()に渡している場合には、WindowListenerの実装は不要」との解説は見当たらないのですが。 宜しくお願いします。
お礼
komi1341さん、色々とご教示ありがとうございました。 今後とも宜しくお願いします。