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);
}
}
No.1ベストアンサー
- 回答日時:
スーパークラスの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);
}
}
}
起動して文字を入力してみてください
toorisugari00さん、回答ありがとうございます。
>スーパークラスのpaintメソッドを使わないと
>スーパークラスの機能をつかえません。
私の書いたプログラムは両方ともスーパークラスのメソッド「public void paint(Graphics g)」
を呼び出していますが、一体両者のどこが違うのでしょうか。
「public void paint(Graphics g)」メソッド自体が、既にスーパークラスの機能を呼び出してい
るのに、その中で更にスーパークラスの機能を呼び出す意味が さっぱり理解できません。
それも、呼びださなくてもよい場合もあるとは。
何とか私の頭でも理解できるように再度説明を宜しくお願い致します。
No.4
- 回答日時:
オーバーライドについては#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やこれらのクラスのソースコードを読んで下さい。
No.3
- 回答日時:
オーバーライド(上から乗っかる?)という機能が有って、
スーパークラス(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);はいらないのではないでしょうか?
コメントアウトして実行してみてください。
No.2
- 回答日時:
えぇと,
私の書いたプログラムは両方ともスーパークラスのメソッド「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);
}
(略)
}
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- Java java final 1 2022/06/10 22:49
- Java 直し方について教えて頂きたいです。 4 2022/08/13 02:11
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- Java eclipse実行ができない 2 2022/07/27 04:47
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- C言語・C++・C# Windows Formアプリからコンソールを呼び出して文字を出力させたい 8 2023/05/09 10:53
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
継承したクラス側のクラス名の取得
-
関数内の変数に<summary>コメン...
-
C# インターフェイスの実装
-
c++,ある関数のクラスから別の...
-
構造 他のクラスの構造体を別...
-
回答が分かりません。どなたか...
-
アップキャスト、ダウンキャス...
-
C#で処理中の状況をStatusLabel...
-
Java リフレクションについて
-
Tomcatのpropertiesファイルの...
-
ひとつのファイルにクラスは1つ?
-
JSPでbeanプロパティ(配列)を...
-
範囲外の数値を代入したらエラ...
-
C++ クラス名の前のdefine
-
import と extends について
-
C#のクラスライブラリでメッセ...
-
JTable ArrayList 表示されない
-
オーバーロードしたメンバ関数...
-
実行可能jarファイルのファイル...
-
visual studioのデザイナ画面で...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数内の変数に<summary>コメン...
-
範囲外の数値を代入したらエラ...
-
C#にて別クラスの関数を使いたい
-
クラス間でのデータ参照
-
c++,ある関数のクラスから別の...
-
visual studioのデザイナ画面で...
-
C++でfriendクラスにしているの...
-
import と extends について
-
Java リフレクションについて
-
C#のクラスライブラリでメッセ...
-
Java
-
C#でほかのファイルにある自作...
-
ひとつのファイルにクラスは1つ?
-
継承したクラス側のクラス名の取得
-
C# インターフェイスの実装
-
super.paint(g)を呼び出す意...
-
親クラスから子クラスへアクセス。
-
a href="..." とServlet
-
無名パッケージからのインポート
-
実行可能jarファイルのファイル...
おすすめ情報