- ベストアンサー
super.paint(g)を呼び出す意味が理解できません。
- 「super.paint(g)」は親クラスのpaintメソッドをを呼び出していると思うのですが、何故ここで必要なのでしょうか。
- 「Sample1」と「JFrameTest」の違いはなんでしょうか。
- 「Sample1」では「super.paint(g)」を呼び出す必要がないが、「JFrameTest」では必要。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
スーパークラスのpaintメソッドを使わないと スーパークラスの機能をつかえません。 JTextAreaで例をあげます。 import javax.swing.*; import java.awt.*; public class test extends JFrame{ public static void main(String args[]){ new test(); } public test(){ setBounds(100,100,400,400); setDefaultCloseOperation(EXIT_ON_CLOSE); add(new MyText()); setVisible(true); } public class MyText extends JTextArea{ public MyText(){ super("HelloWorld"); } public void paint(Graphics g){ // super.paint(g); g.drawLine(0,0,100,100); } } } 起動して文字を入力してみてください
その他の回答 (3)
- ketuago65
- ベストアンサー率50% (13/26)
オーバーライドについては#3の方がおっしゃる様に、親クラスの昨日を受け継ぐのではなく、機能の上書きです。 なのでsuperで呼び出してあげないと親クラスの機能を使えません。 また、superを使う場合と使わない場合の違いですが、FrameはWindowクラス、AppletはPanelクラスを継承しています。 paintはContainerクラスのメソッドで、Window、Panelどちらもそれを継承していますが チラッとソースコードを見たところWindowクラスはpaintをオーバーライドし中でContainerクラスのpaintを呼び出し処理を加えていましたが、Panelは継承しているだけでしたので、 そこに違いがあるのでしょう。 詳しくプログラムを見てないので適当な推測ですが、Window(Frame,JFrame含む)はあくまで枠組みでしかなく、そこに文字とかを書き込もうと思ったらその準備をしなくてはならない。これがsuper.paint(g)で得られる処理。 一方Panelの方は文字とかを書き込める設定が既にされているクラスでAppletはブラウザに張っているだけなのでWindowクラスでやってるpaintの処理がなくても出来る、とかじゃないでしょうか? 実際、JFrameを継承したクラスに直接paintをオーバーライドするのではなく、Panelクラスを継承したクラスに上のコードと同じようにsuper.paint(g)の呼び出しがないpaintをオーバーライドし、フレーム側に貼り付ければ正常に動きました。 あくまで勝手な推測ですのでもっとちゃんと理解したいのであれば、APIやこれらのクラスのソースコードを読んで下さい。
- toorisugari001
- ベストアンサー率80% (4/5)
オーバーライド(上から乗っかる?)という機能が有って、 スーパークラス(Applet, JFrame)のメソッドを一度殺して、 書き換えるというものがあります。 public class test extends JFrame{ public void setVisible(boolean bl){ System.out.println("ぴ~よぴよ"); } } testクラスはJFrameを継承しているのに mainメソッドやコンストラクタで[test].setVisible(true);とか言う文を書くとなにも表示されず、 ふざけた文字が出力されます。 JFrameの中のsetVisibleメソッドが死んで書き換えられています。 public class test extends JFrame{ public void setVisible(boolean bl){ System.out.println("今度はウィンドウも表示します"); super.setVisible(bl); } } さっきのはコピーしてコンパイルするだけで動くので 習うより慣れろ、考えるな感じるんだ、というように、 一度起動してみてください。 というか JFrameを使った方のJFrameTestではsuper.paint(g);はいらないのではないでしょうか? コメントアウトして実行してみてください。
- Tacosan
- ベストアンサー率23% (3656/15482)
えぇと, 私の書いたプログラムは両方ともスーパークラスのメソッド「public void paint(Graphics g)」を呼び出していますが というのはどこを指しているのでしょうか? そのあとの 「public void paint(Graphics g)」メソッド自体が、既にスーパークラスの機能を呼び出しているのに というのは, どうしてそのように思うのでしょうか? なんとなくオーバーライドについて勘違いされているように感じるのですが....
お礼
Tacosanさん、回答ありがとうございます。 ======================================================= public class Sample1 extends Applet { //以下のメッソドはAppletクラスのpaintメソッドを呼び出し オーバーライドしているのではないでしょうか。 public void paint(Graphics g) { g.drawString("java",10,10); } } ============================================================ public class JFrameTest extends JFrame { (略) //以下のメッソドはAppletクラスのpaintメソッドを呼び出し オーバーライドしているのではないでしょうか。 public void paint(Graphics g) { super.paint(g); g.drawString("Today",100,100); } (略) } }
お礼
toorisugari00さん、回答ありがとうございます。 >スーパークラスのpaintメソッドを使わないと >スーパークラスの機能をつかえません。 私の書いたプログラムは両方ともスーパークラスのメソッド「public void paint(Graphics g)」 を呼び出していますが、一体両者のどこが違うのでしょうか。 「public void paint(Graphics g)」メソッド自体が、既にスーパークラスの機能を呼び出してい るのに、その中で更にスーパークラスの機能を呼び出す意味が さっぱり理解できません。 それも、呼びださなくてもよい場合もあるとは。 何とか私の頭でも理解できるように再度説明を宜しくお願い致します。