初めて自分の家と他人の家が違う、と意識した時

 super.paint(g)を呼び出す意味が理解できません。

 お早うございます、JAVAの初心者です、基本的な内容が理解出ずに悩んでいます。
 宜しくお願い致します。

 以下のプログラムを書いてやりました、「Sample1」は、public void paint(Graphics g)で
オーバライドしてやると、そのまま”java”が表示されますが、JFrameTestでは、
public void paint(Graphics g)のなかに「super.paint(g)」を書いてやらないと、
一応windowは表示はされるのですが、パネルが透明になって下の文字とか、
画像が見えてしまいます。(何故か文法エラーにはなりません)

 しかし、public void paint(Graphics g)の内に「super.paint(g)」を書いてやると、
普通通り表示されます。
 この違いというか原因はなになのでしょうか。
 「super.paint(g)」は親クラスのpaintメソッドをを呼び出していると思うのですが、
何故ここで必要なのでしょうか。
 「Sample1」との違いが分かりません、何とぞ宜しくお願い致します。

=======================================================

public class Sample1 extends Applet
{
public void paint(Graphics g)
{
g.drawString("java",10,10);
}
}

============================================================

public class JFrameTest extends JFrame
{
JFrameTest()
{
setSize(400,300);
setTitle("JFrameTest");
}

public void paint(Graphics g)
{
super.paint(g);
g.drawString("Today",100,100);
}

public static void main(String[] args)
{
JFrame jf = new JFrameTest();
jf.setVisible(true);
}
}

A 回答 (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);
}
}
}

起動して文字を入力してみてください
    • good
    • 0
この回答へのお礼

 toorisugari00さん、回答ありがとうございます。

 >スーパークラスのpaintメソッドを使わないと
 >スーパークラスの機能をつかえません。

 私の書いたプログラムは両方ともスーパークラスのメソッド「public void paint(Graphics g)」
を呼び出していますが、一体両者のどこが違うのでしょうか。
 「public void paint(Graphics g)」メソッド自体が、既にスーパークラスの機能を呼び出してい
るのに、その中で更にスーパークラスの機能を呼び出す意味が さっぱり理解できません。
 それも、呼びださなくてもよい場合もあるとは。

 何とか私の頭でも理解できるように再度説明を宜しくお願い致します。

お礼日時:2010/09/01 23:17

オーバーライドについては#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やこれらのクラスのソースコードを読んで下さい。
    • good
    • 0

オーバーライド(上から乗っかる?)という機能が有って、


スーパークラス(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);はいらないのではないでしょうか?
コメントアウトして実行してみてください。
    • good
    • 0

えぇと,


私の書いたプログラムは両方ともスーパークラスのメソッド「public void paint(Graphics g)」を呼び出していますが
というのはどこを指しているのでしょうか?
そのあとの
「public void paint(Graphics g)」メソッド自体が、既にスーパークラスの機能を呼び出しているのに
というのは, どうしてそのように思うのでしょうか?
なんとなくオーバーライドについて勘違いされているように感じるのですが....
    • good
    • 0
この回答へのお礼

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);
}
(略)
}
}

お礼日時:2010/09/02 00:17

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報