お世話になっています。
Java言語を始め、オブジェクト指向というなれない環境にいます。(今まではBASICを利用)
今回、jPanelなるものを使い、その中に四角形などを描画したいのですが、
うまくいきません。
public void paintComponent(){
Graphics pnl = panel.getGraphics();
pnl.setColor(new Color(0,0,255));
pnl.drawOval(100,100,50,50);
}
こういう関数を作り、プログラムから呼び出しています。(フレーム作成時には表示しない)
おそらくこの辺りがダメだと思うのですが、よくわかりません。
すいませんが、jPanelの使い方を詳しく教えていただけないでしょうか。
ゲームを作る課題なのですが、ここで詰まってしまい進めません。
ご存じの方がいらっしゃいましたら、ご教授ください。
よろしくお願い致します。
No.3ベストアンサー
- 回答日時:
このクラスの定義をざっくり書くと、
class Frame extends JFrame{
Jpanel panel = new Jpanel(); //描画領域
Jpanel label = nel Jpanel("得点");
JButton btnNewButton = new JButton("ヘルプ");
public Frame(){
いろいろコンポーネントを追加...
btn.newActionListener(this);
this.setVisible(true);★
}
actionPerformed(ActionEvent e){
this.repaint(); //自身のインスタンス(フレームを再描画)
}
}
と推測しました。★のタイミングでpaintComponent(Graphics g)が呼び出されます。引数Graphics ???(なんでもよい)は必要です。描画が必要なタイミングでpaintComponentメソッドを呼び出します。詳しくは後述。
>はよく見るカタチのサンプルですが、これは呼びださなくてもjFrameだけなら描画されていることがないですかね?^^;
回答はJPanelを想定しております。
JFrameに対して、setVisible(true)した段階では、JPanelのpaintComponentのことまで構っていないように感じられますが、きちんと伝搬されます。 contentPane.add によってJpanelをJFrameに追加しているためです。
描画の際は、描画対象となるオブジェクトの情報がGraphicsクラスに入っているため、Graphicsのインスタンスを参照します。Graphics gならば"g"がインスタンスにあたります。
>引数に何を渡しているのか、それはどうやって取得するのか……
paintComponentの引数は(Graphics g)が必須だったと思います。
"paintComponent Java" をキーワードとして検索します。JComponentのクラスに関するドキュメントが得られます。クラスドキュメントを参照する限りでは、引数Graphics gは必須です。その他の条件のpaintComponentメソッドがここに記載されていないためです。
http://docs.oracle.com/javase/jp/6/api/javax/swi …
Jpanelじゃないの?という疑問が生まれると思いますが、前提をお読みください。
java.lang.Object
└java.awt.Component ◎
└java.awt.Container
└javax.swing.JComponent ★
└javax.swing.JPanel ☆
(前提)
1)お示ししたURLは★のJComponentですが、☆のJPanelから上位のクラスで定義されているメソッドを参照することができます。今回は継承と呼びます。
2)定義済みのメソッドをプログラマ自身が書き換えることができます。これをオーバーライドと言います。
3)特に定義しなくても★のpaintメソッドでpaintComponent(Graphics g)を呼ぶよう定義されているため、プログラマは、paintComponent(Graphics g)を定義すればよいことになります。
(重要)
・paintComponent(Graphics g)が発生するのは、イベントが発生して、FrameやPanelに描画の必要が生じた時です。例えばフレームの表示、サイズの変更が挙げられます。他にもあるかもしれませんが全てを把握しておりません。
JFrame.setVisible(true)を強調しているのは、これが発行されるまでJFrameに配置したコンポーネントのpaintComponentが呼ばれることがないためです。
paintComponent()と定義することはできますが、Javaは、paintComponent(Graphics g)に対して呼び出しをかけるので、定義されたメソッドは呼び出されないことになります。
プログラム上の処理が発生して、再描画が必要であれば、そのコンポーネントに対して、repaint()を起こすことになります。その延長でpaintComponent(Graphics g)が呼び出されます。repaintは◎で定義されているメソッドです。前提1に基づいて呼び出し可能となります。
>(※1)System.out.printlnでnullpointerが返ってきていないのでそう判断
これは再上位から「標準出力」をとっているだけなので、NullPointerは返りません。ハンドル(Javaではインスタンス)が取得できていることにはなりません。
>Javaにはデバイスコンテキストという概念が表に出ていないと聴きました。
インスタンスという概念で特定をします。
例えば、paintComponent(Graphics g)の場合、
paintComponentメソッドは、Graphicsクラスの gインスタンス(変数)を引数に持つ。という意味になります。デバイスハンドラやデバイスコンテキストはインスタンスになっているという認識で私はいます。
また、paintComponent()としてしまうと、引数を持たないpaintComponentメソットとなります。同時に定義することができる全く違うメソッドになってしまうので注意が必要です(多相性といいます)。
遅くなりました!
ありがとうございます!!
何とか課題を提出するところまで持って行けました!!
手続き型でやってきたので、なかなか慣れることが難しかったので、本当に助かりました。
No.2
- 回答日時:
public void paintComponent(Graphics g){
g.setColor(new Color(0,0,255));
g.drawOval(100,100,50,50);
}
ではダメでしょうか?
以下ご参考です。
http://oshiete.goo.ne.jp/qa/810010.html
御回答有り難うございます。
それはやってみたのですが、全く描画されずここに質問させていただいております。
取り敢えず参考ページの方を拝見させて頂きます。
個人的意見
public void paintComponent(Graphics g){
g.setColor(new Color(0,0,255));
g.drawOval(100,100,50,50);
}
はよく見るカタチのサンプルですが、これは呼びださなくてもjFrameだけなら描画されていることがないですかね?^^;
引数に何を渡しているのか、それはどうやって取得するのか……
その辺りもまだわかっていません。
5年間手続き型を触ってきたので、いまいち慣れていなくて……
No.1
- 回答日時:
プログラム全体はどうなっていて, そしてなにがどう「うまくいかない」のですか?
この回答への補足
「何がうまくいかないのか」という点については、ハンドルの取得についてです。
オブジェクト指向ではインスタンスというのでしょうか。
jPanelと言うものは私の中では「ウインドウ」の一部だと思っています。
つまり、生成された時に何らかのアドレス(ハンドル)が生成されていると考えています。
そのハンドルを取得できている(※1)にもかかわらず、なぜ線が描画されないかということがわかりません。
(※1)System.out.printlnでnullpointerが返ってきていないのでそう判断
Javaにはデバイスコンテキストという概念が表に出ていないと聴きました。
では、どのように画像や線を描画し、アニメーションさせるのかを今しらべています。
申し訳ありませんが、ご教授の方お願い致します。
御回答有り難うございます。
プログラム全体はあまり公開したくないので、一部だけですが。
コンストラクタで画面を定義します。
setResizable(false);
setTitle("課題");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 800, 600);
//jPanel
panel = new JPanel();
panel.setBackground(Color.WHITE);
panel.setBounds(5, 5, 600, 520);
contentPane.add(panel);
//得点表示(jLabel)
JLabel label = new JLabel("得点");
label.setHorizontalAlignment(SwingConstants.CENTER);
label.setVerticalAlignment(SwingConstants.TOP);
label.setBounds(616, 16, 178, 178);
contentPane.add(label);
//お助けボタン(jButton)
JButton btnNewButton = new JButton("ヘルプ");
btnNewButton.setBounds(631, 460, 152, 70);
contentPane.add(btnNewButton);
こういった感じの、jPanel上に線を引きそこをゲーム板としたいのです。
よろしくお願いします
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript [Java] Edgeでのアドレスバー非表示について 3 2022/04/20 17:51
- Visual Basic(VBA) VBA リボンののリカバリーでオーバーフローエラーになります 2 2023/07/04 19:07
- Visual Basic(VBA) エクセルマクロでアニメを作る方法を教えてください。 1 2023/02/07 14:27
- CAD・DTP 「機能ブロック図」の描画用フリーソフトを教えてください 1 2022/09/23 16:12
- その他(プログラミング・Web制作) Pythonの作業環境・作業フォルダの迅速な設定・指定方法 3 2022/04/01 07:55
- C言語・C++・C# 【C++】IDirect3DSurfaceのディープコピーは可能ですか? 1 2022/07/06 02:47
- その他(プログラミング・Web制作) 次に、楽天のアジャイル就活に参加して、1日で内定を獲得できる。私は大企業に就職できる? 2 2022/04/17 13:38
- アニメ アニメ製作が形成してきたパターンや方式と今後について 2 2023/08/11 03:49
- CAD・DTP Autocad Scriptファイルからの入力とコマンドラインからの入力が違う 1 2023/08/01 09:13
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
このQ&Aを見た人はこんなQ&Aも見ています
-
あなたの「必」の書き順を教えてください
ふだん、どういう書き順で「必」を書いていますか? みなさんの色んな書き順を知りたいです。 画像のA~Eを使って教えてください。
-
人生最悪の忘れ物
今までの人生での「最悪の忘れ物」を教えてください。 私の「最悪の忘れ物」は「財布」です。
-
【大喜利】看板の文字を埋めてください
旅行先でほぼ消えかけている看板に出会いました。 何を気を付ければいいのか穴埋めをして教えてください。
-
何歳が一番楽しかった?
自分の人生を振り返ったとき、何歳のころが一番楽しかったですか? 子供の頃でしょうか、それとも大人になってからでしょうか。
-
【穴埋めお題】恐竜の新説
【大喜利】 考古学者が発表した衝撃の新説「恐竜は、意外にもそのほとんどが〇〇〇」 (〇〇〇に入る部分だけを回答して下さい)
-
JAVAでの背景画像表示
Java
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・2024年に成し遂げたこと
- ・3分あったら何をしますか?
- ・何歳が一番楽しかった?
- ・治せない「クセ」を教えてください
- ・【大喜利】看板の文字を埋めてください
- ・【大喜利】【投稿~12/17】 ありそうだけど絶対に無いことわざ
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・【穴埋めお題】恐竜の新説
- ・我がまちの「給食」自慢を聞かせてっ!
- ・冬の健康法を教えて!
- ・一番好きな「クリスマスソング」は?
- ・集合写真、どこに映る?
- ・自分の通っていた小学校のあるある
- ・フォントについて教えてください!
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・10代と話して驚いたこと
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Javaで文字の角度を変えて表示...
-
VB.NET フォーム上に描いたグ...
-
MFCでMSペイントみたいなツー...
-
GDI+で描画した画像を消去する...
-
C# DataGridView のCellPaintin...
-
Androidで画像の中で指定した範...
-
canvasで表示されてる画像を1...
-
画面のちらつきの原因が知りた...
-
VB.NETのSendMessageを教えてく...
-
Javaを使って、円を描きたい
-
「タイプ初期化子が例外をスロ...
-
変数名の付け方
-
エクセルVBAで、条件に一致する...
-
VB.NETでフォーム上にExcelのよ...
-
エクセルVBA 画像を貼り付ける...
-
C#のクラスで値渡しをする
-
パワーポイントのVBAでテキスト...
-
配列の重複する値とその個数を...
-
VB.NET Newしたものを変数に代...
-
共通で使う関数を集めたクラス...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
JAVAでの背景画像表示
-
VB.NET フォーム上に描いたグ...
-
画面のちらつきの原因が知りた...
-
VB.NETのSendMessageを教えてく...
-
SwingとEDT(イベントディスパッ...
-
重なった要素上でのイベントで...
-
C# DataGridView のCellPaintin...
-
Canvas等の図形を移動する時,直...
-
描画処理が実行されない
-
複数画像表示切り替え Visual c++
-
Javaで割り当てられていない文...
-
requestanimationframeを一斉に...
-
アクセスで他アプリから復帰し...
-
C# リストビューの特定のセルの...
-
Androidで画像の中で指定した範...
-
このプログラミングをどう組み...
-
Javaで文字の角度を変えて表示...
-
javaのpaintComponentについて
-
java.awt.peer?
-
Labelコントロールの背景をグラ...
おすすめ情報