質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

1528閲覧

javaでOverrideした関数が呼ばれない

yukkuri

総合スコア624

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2018/07/26 12:18

javaでOverrideした関数が呼ばれない

現在、ゲームに使うライブラリーを作っています。
その際、ゲームによって処理を分けられるよう、オーバーライドをする
前提の関数を作りました。しかし、タイトルのように、その関数が呼ばれません。

発生している問題・エラーメッセージ

タイトルの通り

該当のソースコード

java

1package Lib.Game; 2 3import java.awt.Color; 4import java.awt.event.KeyEvent; 5 6import javax.swing.JFrame; 7 8public class BaseGame extends JFrame 9{ 10 BaseAction ba; 11 12 public BaseGame(){} 13 14 public BaseGame( int width, int height ) 15 { 16 ba = new BaseAction( this ); 17 18 setSize( width, height ); 19 setLocationRelativeTo( null ); 20 setDefaultCloseOperation( EXIT_ON_CLOSE ); 21 add( ba ); 22 setVisible( true ); 23 } 24 25 public void b_Panel() 26 { 27 System.out.println( "えらー" ); 28 } 29 30 public void b_Key( KeyEvent e ) 31 { 32 } 33 34 public void b_Graphic() 35 { 36 } 37 38 public void repaint( int tag ) 39 { 40 ba.paint(); 41 } 42 43 public void Background( Color c ) 44 { 45 ba.Background( c ); 46 } 47 48 public void Background( int c ) 49 { 50 ba.Background( c ); 51 } 52 53 public void setColor( Color c ) 54 { 55 ba.setColor( c ); 56 } 57 58 public void setColor( int c ) 59 { 60 ba.setColor( c ); 61 } 62 63 public void fillRect( int x, int y, int width, int height ) 64 { 65 ba.fillRect( x, y, width, height ); 66 } 67 68 public void add( BaseAction ba ) 69 { 70 this.ba.add( ba ); 71 } 72} 73 74package Lib.Game; 75 76import java.awt.Color; 77import java.awt.Graphics; 78import java.awt.event.KeyEvent; 79 80import javax.swing.JPanel; 81 82public class BaseAction extends JPanel 83{ 84 Graphics m_g; 85 86 BaseGame m_bg; 87 88 public BaseAction(){} 89 90 public BaseAction( BaseGame bg ) 91 { 92 m_bg = bg; 93 } 94 95 @Override protected void processKeyEvent( KeyEvent e ) 96 { 97 b_Key( e ); 98 } 99 100 @Override protected void paintComponent( Graphics g ) 101 { 102 requestFocusInWindow(); 103 super.paintComponent( g ); 104 m_g = g; 105 106 b_Graphic(); 107 } 108 109 public void b_Panel() 110 { 111 m_bg.b_Panel(); 112 } 113 114 public void b_Key( KeyEvent e ) 115 { 116 m_bg.b_Key( e ); 117 } 118 119 public void b_Graphic() 120 { 121 m_bg.b_Graphic(); 122 } 123 124 public void Background( Color c ) 125 { 126 setBackground( c ); 127 } 128 129 public void Background( int c ) 130 { 131 setBackground( new Color( c ) ); 132 } 133 134 public void setColor( Color c ) 135 { 136 m_g.setColor( c ); 137 } 138 139 public void setColor( int c ) 140 { 141 m_g.setColor( new Color( c ) ); 142 } 143 144 public void fillRect( int x, int y, int width, int height ) 145 { 146 m_g.fillRect( x, y, width, height ); 147 } 148 149 public void add( BaseAction ba ) 150 { 151 b_Panel(); 152 } 153 154 public void paint() 155 { 156 repaint(); 157 } 158} 159

試したこと

Eclipseで確認したところ、しっかりオーバーライドできるソースになっているようです。

補足情報(FW/ツールのバージョンなど)

javaのバージョンは7です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

とりあえず、3点ほど気になった点を掲示します。
オーバーライドの問題ではなくjavaのGUI固有の問題です。

BaseGameを呼び出している処理について

掲示されたソースコードでは、BaseGameを呼び出すコードがないため、
詳しくは解りませんが、

もし、

java

1 BaseGame game = new BaseGame();

としている場合は、BaseGameクラスのコンストラクタ「BaseGame()」を下記のように変えてみてください

java

1 public BaseGame() { this(400, 300); }

※引数がないコンストラクタはなんの処理も書いていないため、サイズ指定のあるコンストラクタを呼び出すように書き換えています。

BaseGameクラスのコンストラクタについて

掲示されたソースコードでは、BaseActionオブジェクトを単純にaddしていますが、
この方法ですと、BaseActionをBaseGame上に適切に配置されません(JPanelはデフォルトでは縦横サイズ0で配置されるため、描画不要と判断されてしまう)。

下記のように、BaseGameのサイズにあわせて拡大されるようにしてください。

java

1 public BaseGame( int width, int height ) 2 { 3 ba = new BaseAction( this ); 4 5 setSize( width, height ); 6 setLocationRelativeTo( null ); 7 setDefaultCloseOperation( EXIT_ON_CLOSE ); 8 setLayout(new java.awt.BorderLayout()); 9 add( ba , java.awt.BorderLayout.CENTER); 10 setVisible( true ); 11 12 } 13

processKeyEventメソッドの有効化

process***メソッドについてですが、これらはenableEventsメソッドを使用するなどして有効化しないと、呼び出されません。
BaseActionコンストラクタを下記のように書き換え、KeyEventを有効化する必要があります。

java

1 public BaseAction( BaseGame bg ) 2 { 3 m_bg = bg; 4 enableEvents(java.awt.AWTEvent.KEY_EVENT_MASK); 5 }

コメントの追記について、

例えば、BaseGameクラスを継承したBaseGame2から、BaseGame(int width,int height)を呼び出す方法という意味でしょうか?

もしそうなら、BaseGame2のコンストラクタ内で、

java

1 public BaseGame2(){ 2 super(400, 300); 3 }

とすれば、良いです。

コンストラクタ内で、 this(...)とか、super(...)とかを呼び出した場合、
thisの場合は、自分のクラスの別のコンストラクタ呼び出し、
superの場合は、親クラスのコンストラクタ呼び出しを行うことができます。

注意する点として、this(...)とかsuper(...)はコンストラクタの1番先頭にしか書けません。

java

1 // OKな例 2 public BaseGame2(){ 3 super(400,200); 4 hoge(); 5 } 6 7 // NGな例 8 public BaseGame2(){ 9 hoge(); 10 super(400,300); 11 }

投稿2018/07/26 13:08

編集2018/07/26 14:42
whistyun

総合スコア149

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yukkuri

2018/07/26 13:15

whistyunさん、わかりやすくありがとうございます。 ちなみに、BaseGameを呼び出しているクラスのソースはこちらです。 import java.awt.Color; import java.awt.event.KeyEvent; import Lib.Game.BaseGame; public class debug extends BaseGame { static BaseGame bg; public static void main( String[] args ) { bg = new BaseGame( 640, 480 ); } /* @Override public void b_Panel() { System.out.println( "サブ" ); Background( 0x000000 ); }*/ @Override public void b_Key( KeyEvent e ) { // if( e.getID() == KeyEvent.KEY_PRESSED ){ System.out.println( "キーが押されたよ!" ); // } } @Override public void b_Graphic() { setColor( Color.BLACK ); fillRect( 0, 0, 640, 480 ); /* g.setColor( Color.BLACK ); g.fillRect( 100, 100, 200, 100 );*/ } }
yukkuri

2018/07/26 13:18

すいません、追記です。 処理なしのコンストラクタは、クラスを継承するとき、 引数を使用する場合がわからず、の結果です。 よろしければ、引数を使うコンストラクタを使いたい場合の 継承についても教えてください。お願いします。
whistyun

2018/07/26 14:54 編集

コメント追記されたソースのmainメソッドですが、debugクラスではなくBaseGameのオブジェクトを生成しているため、debugクラスでオーバーライドされたメソッドは呼び出されません。 回答に追記した内容をもとに、debugクラスのコンストラクタを用意し(ちゃんと、super( 640, 480 )よびだしてね)、mainメソッド内の「new BaseGame()」を「new debug()」に書き換えてください
yukkuri

2018/07/26 22:49

思っていたことができました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問