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

このQ&Aのポイント
  • 「super.paint(g)」は親クラスのpaintメソッドをを呼び出していると思うのですが、何故ここで必要なのでしょうか。
  • 「Sample1」と「JFrameTest」の違いはなんでしょうか。
  • 「Sample1」では「super.paint(g)」を呼び出す必要がないが、「JFrameTest」では必要。
回答を見る
  • ベストアンサー

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

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

  • Java
  • 回答数4
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
回答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); } } } 起動して文字を入力してみてください

eiji_0035
質問者

お礼

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

その他の回答 (3)

  • ketuago65
  • ベストアンサー率50% (13/26)
回答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);はいらないのではないでしょうか? コメントアウトして実行してみてください。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

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

eiji_0035
質問者

お礼

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

  • 継承とsuperの意味が理解できません。

    継承とsuperの意味が理解できません。 今日は、JAVA初心者です、宜しくお願いします。 1番目のアプレットで「Applet」を継承させると、正常にWINDOWが表示されます。 しかし、2番目のアプリケ-ションを動かすと、「JFrame」を継承して、「PAINT」 を上書きしているのに、WINDOWは表示されますが、 透明になって、下側の画面が映り、Todayという文字は正常に表示されません。 paintメソッド内に、「super.paint(g);」を書いてやると、正常に動作します。 (3番目のプログラム) テキスト通に、「JFrame」を継承して、「PAINT」を上書きしているのに、「PAINT」 メソッド内で、更に「super.paint(g);」を呼び出す必要性、理由がわかりません。 継承の意味が無いと思うのですが、他に原因があるのでしょうか。 継承している子クラスは、無条件で親クラスのメソッドを上書き出来ると思うのですが、 一体どのような時にSUPERが必要になるのでしょうか。 宜しくお願いします。 1番目のプログラムをと2番目のプログラムはアプレット、アプリケーションとの違い はあるとしても、 基本的な考え方は違わないと考えてるのですが。 ====================================================== 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) { g.drawString("Today",100,100); } public static void main(String[] args) { JFrame jf = new JFrameTest(); jf.show(); } } ====================================================== 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.show(); } } ======================================================

    • ベストアンサー
    • Java
  •  paint( )メッソドをオーバーロードについて

     paint( )メッソドをオーバーロードについて  今晩は、JAVA初心者です、宜しくお願いします。  paint( )メッソドをオーバーロードする時に、<< A >>のコードはそのまま、  g.drawStringを書いていますが、<< B >>のコードでは、  super.paint( )で親クラスを呼んでやらないと、エラーになります。  この両者の違いが全く理解出来ません、どこがどのように違うのでしょうか。  宜しくお願い致します。 ======================================== << A >> public class Sample extends Applet { public void paint(Graphics g) { g.drawString("Applet",50,50); } } ======================================= << B >> public class JFrame_Test extends JFrame { JFrame_Test() { setSize(400,300); setTitle("JFrame_Test"); } public void paint(Graphics g) { super.paint(g); g.drawString("Today",70,70); } public static void main(String[] args) { JFrame jf = new JFrame_Test(); jf.setVisible(true); } } ========================================

    • ベストアンサー
    • Java
  • 実行してもタイトルバーしか表示されません

     JAVAの初心者です。  "Public JFramelTest(){"の箇所で"メソッドの戻りの型がありません"とエラーがでます。  しかし実行はできるので、実行するとダイヤログは表示されますが、タイトルバーのみしか、表示されません。  サイズを大きくすると文字はかけていますが、タイトルバーには"JFrame Test"の文字は有りません。  一体どこが悪いのでしょうか宜しくお願いします。 ============================================================================= //JFrameTest:Swingのフレーム import java.awt.*; import java.awt.event.*; import javax.swing.*; public class JFrameTest extends JFrame{ /* コンストラクタ */ public JFramelTest(){ setSize(800,400); //画面サイズ setTitle("JFrame Test"); //タイトル //×ボタンで終了 addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); } //paint public void paint(Graphics g){ super.paint(g); //JFrameクラスのpaintの呼出し g.drawString("JAVA",80,100); } //main public static void main(String[] args) { JFrame w = new JFrameTest(); w.show(); } }

    • ベストアンサー
    • Java
  • 簡単なこーどですが、エラーの原因が分かりません

    今晩は、JAVAの初心者です、宜しくお願いします。 下のコードでエラーがでます、いくら考えても原因がさっぱり分かりません。 一体何処が悪いのでしょうか、宜しくお願いします。 また、最後の「j.show();」では警告が出ています。 何が原因でしょう?? ============================================================ import java.awt.Graphics; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import javax.swing.JFrame; class JFrame_Ohayou extends JFrame implements WindowListener{ /*********** コンストラクタ ********************/ public JFrame_Ohayou(){ setSize(400,300); setTitle("JFrameのテスト"); addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); } /******************* paint ***********************/ public void paint(Graphics g){ super.paint(g); g.drawString("おはよう",20,40); } } /******************* main ***********************/ public class JFrameTest{ public static void main(String[] args){ JFrame_Ohayou j = new JFrame_Ohayou(); j.show(); } } =============================================================

    • ベストアンサー
    • Java
  • Jpanelへの描画について(初心者です)

    質問1 実行した時に内容が表示されたりされなかったりします、どうしてでしょうか? いろいろ試してみましたが分かりませんでした。 質問2 JPanelではダブルバッファリング機能が備わっているみたいですが、 という事はこのソースでもそれは行なわれているのでしょうか? 以上2点と質問が多いですがよろしくお願いします。 import java.awt.*; import javax.swing.*; public class JFrameTest extends JFrame{  JPanelTest panel;  Container ct;  public static void main(String[] args){   new JFrameTest();  }  public JFrameTest(){   super("JFrameTest");   panel = new JPanelTest();   ct = getContentPane();   setSize(480,480);   setResizable(false);   setVisible(true);   setDefaultCloseOperation(EXIT_ON_CLOSE);   ct.add(panel);  } } class JPanelTest extends JPanel{  public JPanelTest(){   setSize(480,480);  }  public void draw(Graphics g){   g.drawString("Test",240,240);  }  public void paintComponent(Graphics g){   super.paintComponent(g);   draw(g);  } }

    • ベストアンサー
    • Java
  •  インスタンスの作る場合の型宣言

     インスタンスの作る場合の型宣言  今晩は、JAVA初心者です、宜しくお願いします。  下のようなプログラムを書いてやりました。 //JFrame_Test jf = new JFrame_Test(); JFrame jf = new JFrame_Test(); と書き変えてやってもエラーもなく、正常に同じ動作をします。  この両者は文法的にはどのように違うものなのでしょうか。  どうも両者は別の意味を持っているような気がして、色々と調べてみましたが、 よく分かりませんでした。  また、JFrame jf = new JFrame(); とかいても、正常に動作します。 この違いもよく理解出来ないのですが、  これは、JFrame_Testではなく、JFrameという親クラスのオブジェクトを作っ ているということでしょうか、以上宜しくお願いします。 ======================================================== public class JFrame_Test extends JFrame { JFrame_Test() { setSize(200,200); } public void paint(Graphics g) { super.paint(g); g.drawString("XYZ",50,50); } public static void main(String[] args) { JFrame jf = new JFrame_Test(); // JFrame_Test jf = new JFrame_Test(); jf.setVisible(true); } }

    • ベストアンサー
    • Java
  •  static 参照するには??

     static 参照するには??  Java初心者です、宜しくお願いします。  下のようなプログラムを書きましたが、「Container gc = getContentPane();」 の箇所で、「型 JFrame の非 static メソッド getContentPane() を static 参照することはできません」とエラーが出ます。 意味がわかりません、またどのように変更してやればよいのでしょうか。 宜しくお願いします。  ======================================================================= class Canvas1 extends JFrame { public void paint(Graphics g) { g.drawRect(150, 150, 50, 50); } } public class SimpleDraw extends JFrame { public static void main(String[] args) { JFrame jf = new JFrame(); JPanel jp = new JPanel(); Container gc = getContentPane(); gc.add(jp); Canvas1 c = new Canvas1; jp.add(c); jf.add(jp); jf.setVisible(true); } }

    • ベストアンサー
    • Java
  • javaのpaintについて

    public class Main extends JFrame{ public static void main(String args[]){ Main frame = new Main("test"); frame.setVisible(true); } Main(String title){ setTitle(title); setBounds(100, 100, 300, 250); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JMenuBar menubar = new JMenuBar(); JMenu menu1 = new JMenu("File"); menubar.add(menu1); JMenuItem menuitem1 = new JMenuItem("New"); menu1.add(menuitem1); setJMenuBar(menubar); } public void paint(Graphics g){ } } いまウィンドウにメニューバーを表示させようとして上のプログラムで実行させたんですが、画像のようにメニューバーが表示されません。 そこでpaintの引数を消してみたところ表示されます。 しかし、paint内で画像の表示の処理もしたいので引数がないといけません。 どうしたらいいでしょうか?

    • ベストアンサー
    • Java
  • paintメソッドでエラー

    以下はSwingのフレーム上に画像を表示させようとして書いたものの全文です。実行するとSyntax errorがでますが、これはどうしてでしょうか。 なおべつのプログラムでmainメソッドとpaintメソッドを同じクラスに書いたらうまく表示できました。 アドバイスお願いします。 import java.awt.Graphics; import java.awt.image.BufferedImage; import javax.imageio.ImageIO; import javax.swing.JFrame; public class MyImage3 {  public static void main(String[] args) {   MyFrame7 frame1=new MyFrame7();   frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   frame1.pack();   frame1.setBounds(100,100,400,320);   frame1.setVisible(true);  } } class MyFrame7 extends JFrame{  public MyFrame7(){   public void paint(Graphics g){   //この行でSyntax error発生    BufferedImage bImage1=null;    try {     bImage1=ImageIO.read(getClass().getResource("k_1pin.gif"));    } catch (Exception e) {     e.printStackTrace();    }    g.drawImage(bImage1,40,40,this);   }  } }

    • ベストアンサー
    • Java
  • 「継承されたメソッドの可視性を下げることは出来ません。」というエラーの

    「継承されたメソッドの可視性を下げることは出来ません。」というエラーの意味がわかりません。  JAVA初心者です、宜しくお願いします。  下のようなコードを書きましたが、"void paint(Graphics g)"の箇所で 「Canvasから継承されたメソッドの可視性を下げることは出来ません。」 とのエラーメッセジが出ました。  "public void paint(Graphics g)"とかくと、エラーは消えました。  何故"public"をつける必要があるのでしょうか。  また、クラス自身には、publicをつけない場合には、publicと見なされると本で読みましたが  メッソドにはこのようなルールはないのでしょうか。 ======================================= public class Canvas_test extends Canvas { public static void main(String[] args) { JFrame frame = new JFrame(); frame.setTitle("Canvas_test"); frame.setBounds(0,0,480,380); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setResizable(false); frame.setLayout(null); JPanel cp = new JPanel(); cp.setLayout(null); frame.add(cp); cp.setBounds(38,20,400,300); Canvas canvas = new Canvas_test(); cp.add(canvas); canvas.setBounds(0,0,400,300); frame.setVisible(true); } void paint(Graphics g) { g.drawString("aaaa",40,40); } } ========================================

    • ベストアンサー
    • Java