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

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

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

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

Q&A

解決済

2回答

9446閲覧

paintComponentの挙動がわからない

chankane

総合スコア139

Java

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

0グッド

2クリップ

投稿2017/06/28 07:34

###前提・実現したいこと
こんにちは毎度お世話になっております。
java swing でアプリケーションをつくっている最中によくわからない挙動がおこりました。具体的には、paintComponentが動きません。
これが解決されないと先に進めないので大変困っております。なんだかうまくつかめないような質問だとは自分でもおもいますが、お助けよろしくお願いします。

###発生している問題
下の3行はコードの抜粋です。(まだ実際にこの関数を呼び出してはいない)
この3行を含めたままコンパイル&実行すると、paintComponentが動きません。(画面が灰色。printlnでも確認)

Java

1 public void add(GameObject object){} 2 3 public void remove(GameObject object){}

しかしこの3行を消し去るorコメントアウトすると、正常に動きます。(描写したいものがちゃんと表示されます。)

###試したこと
全角空白でも入っていたかな?と考えてわざと空白を入れてみたが、そもそもその場合コンパイルできなかった。

###補足情報(言語/FW/ツール等のバージョンなど)
エディタ:メモ帳
javac のバージョン:javac 1.8.0_65
メモ帳とコマンドプロンプトを再起動してもうまくいかなかった
他のPCでも同じ挙動が起きるかテストしたが、そこでも動かなかった。
コード全体の情報は、追記依頼をしていただければ公開いたします。

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

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

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

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

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

guest

回答2

0

すみません。似たような状況の質問が存在しました。
同じ現象が起きていた質問
無事解決いたしました。お騒がせいたしました。
今後このようなことがないように努力します。

投稿2017/06/28 09:03

chankane

総合スコア139

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

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

0

ベストアンサー

とんちんかんなことを言ってしまったので、大幅に修正します。

paintComponentメソッドは、画面への描画が必要な際に、自動的に呼び出されます。
呼び出されるタイミングとしては、setVisibleが呼ばれたとき、ウィンドウサイズが変更されたときなどです。
質問者様の最初のプログラムでも、画面表示後にぐいぐいウィンドウを引き延ばせば、ともすれば描画が行われたかもしれません。

こちらのサイトに書いてありますように、明示的にpaintComponentを呼び出したい際には、repaintメソッドの呼び出しが必要です。

  1. フレームの初期化
  2. setVisible(true);
  3. パネルの初期化
  4. パネルをadd
  5. repaint()

こうすれば、正しい表示が得られるかと思います。

以降、最初の解答。


swingのJComponentクラスは、awtのComponentクラスを継承しているのですが、
Componentクラスには、addメソッドとremoveメソッドが既に存在しています。

ご自身でメソッドを定義する際は、ほかのクラスのメソッドと名前が衝突しないようにしてください。
動詞1単語の命名は簡潔ですが、このような問題が生じる場合がしばしばあります。

投稿2017/06/28 07:45

編集2017/06/28 09:43
LouiS0616

総合スコア35658

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

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

chankane

2017/06/28 07:52 編集

メソッド名をaddGameObjectとremoveGameObjectにかえても挙動がかわりませんでした。 名前衝突については勉強になりました。ありがとうございます。
LouiS0616

2017/06/28 07:57

違いましたか... 失礼しました。 名前が衝突していないとなると、ちょっと不思議な挙動ですね... ソースコードを提示していただければ、より正確な回答が得られるかと思います。
chankane

2017/06/28 09:13

すみません。自己解決いたしました。 具体的には 1. フレームの初期化 2. setVisible(true); 3. パネルの初期化 4. パネルをadd となっていた文を 1. フレームの初期化 2. パネルの初期化 3. パネルをadd 4. setVisible(true); としたら無事に動きました。 ただ、なぜ前者のほうではうまくいかない場合があるのかがまだわかりません。 ご存じでしたらご教授願えないでしょうか?
LouiS0616

2017/06/28 09:30

解決されたようで何よりです。 解答を編集しておきました。
LouiS0616

2017/06/28 09:32

あれ、これはawtだけかもしれません... ちょっと確認してみます。
LouiS0616

2017/06/28 09:44

確認して修正しました。
chankane

2017/06/28 09:51

ゲームなのでrepaintは既に呼び出しております。すいません、情報不足でしたね(;´・ω・) 毎ループrepaintを呼び出していることは確認できたのですが、毎ループpaintComponentが呼ばれていないようでした。以下確認方法です。 repaintを呼び出すと同時に”repaint”とコンソールに出力させ、paintComponent内で”paintComponent”とコンソールに出力するように書き加えたら repaint repaint repaint repaint ... となりました。
chankane

2017/06/28 09:53

ちなみに自己解決の方法で直したあとの出力は repaint paintComponent repaint paintComponent repaint paintComponent ... でした
LouiS0616

2017/06/28 10:25

IntelliJ IDEAで適当にプログラムを組んでみたところ、同じような問題が発生しました。 ...が、一行全く関係ないコードを入れると、なぜか動くようになりました。 開発環境も異なりますし、コードに問題があるということになるのかと思いますが... 見当もつかないです。お力になれなくてすみません。
LouiS0616

2017/06/28 10:32

この質問は、質問者様の自己解決でいったん閉めて、 出来るだけ簡単なコードで状況を再現し、新たに質問を立ててみてはいかがでしょうか?
chankane

2017/06/28 10:40

一通り開発が終わったらそのようにいたします。ただ >一行全く関係ないコードを入れると、なぜか動くようになりました。 この部分で共通していますのでこの言語に共通する挙動なのかもしれません(と勝手に解釈) 原因はわかりませんでしたが、これで開発を続けられます。 さいごに、謝らなくても大丈夫です(*^-^*)。LouiS0616さまのように、協力してくださる方々はとても心強いです。 ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問