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

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

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

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

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

Q&A

解決済

2回答

1767閲覧

swingでダブルバッファリングしたい

Alpa

総合スコア80

Java

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

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

0グッド

0クリップ

投稿2018/02/27 12:39

swingでpaintメソッド使ってゲームを作成しているのですが
ダブルバッファリングの仕方がわかりません
どのようにしたらいいか調べてみたのですが
Appletの仕方しかなかったので(自分が調べた限り)
もし仕方や仕方が書いてあるサイト等があるのでしたら
教えてください
ご回答お願い致します

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/02/27 13:05 編集

Swing の グラフィック部分は awt ( アプレットと同じ) だったような
guest

回答2

0

ベストアンサー

ソースコードがないため、状況を把握しにくいのですが、とりあえず次の点に注意してソースを見なおしてみて下さい。

  1. 通常の場合、KSwordOfHasteさんがおっしゃっている通り、swingにはダブルバッファリングの機能がありますので、特に意識する必要はないはずです。

  2. ただし、JFarmeには、多分ダブルバッファリングの機能はありませんので、JFrame#paintをオーバーライドして、描画している場合はこの限りではありません。

  3. そういうこともあり、普通はJFrameのpaintメソッドをオーバーライドして描画することはせずに、描画はJPanelなどで行い、そのJPanelのインスタンスをJFrameに追加するという方法をとります。

  4. JPanelで描画する場合、paintメソッドをオーバーライドするのは反則行為です。paintメソッドではなく、paintComponentメソッドをオーバーライドしなくてはなりません。もし、paintをオーバーライドした場合、それは反則行為ですのでswingの様々な機能は保証されません。

ソースコードの提示がないので、

JPanelの引数をtrueにしてみても無理でした

とか言われても、それを正しく行っているのか判断がつきませんので、的確なアドバイスは行えません。

とりあえず、前述の注意点が正しく行われているか確認をしてみてください。

投稿2018/02/28 01:49

編集2018/02/28 05:54
ngsvx

総合スコア287

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

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

KSwordOfHaste

2018/02/28 05:14

JFrameに直接描画という発想が自分にはなかったのですが、言われてみるとゲームプログラムを「コンポーネント階層なんて使わない」みたいな感覚でJFrameに直接描画するようなケースも多そうだなぁと気づきました。確かにJFrameにダブルバッファリング機能はないですね。JFrame#isDoubleBufferedはComponentのデフォルト実装(false)が返されてるだけでした。
ngsvx

2018/02/28 05:52

うーん、どうなんでしょう? ゲームでも、画面全部を使ったシューティングみたいなもの以外は、各役割を持つ領域があると思うので(メニューの領域、メインの領域みたいな)、そういった領域の描画をクリッピング処理する目的でコンポーネントを使用することは、普通にありそうな気がします。 なので、JFrameに直接paintというのは、やはり使う機会は少ないのではないかと。。。 使ったことがないので、断言はできませんが、もしかしたらフルスクリーンモードで描画する際には使うメリットがあるのかな?
KSwordOfHaste

2018/02/28 06:45 編集

> JFrameに直接描画するようなケース すみません、言葉が足りませんでした。これは「ゲームを作る目的でswingを学ぼうとしている人がそういうふうに作ろうと考えるケース」といったつもりでした。 swingでGUIを作ろうとする場合、おっしゃるとおりJFrame#paintをオーバーライドするメリットはあまりない気がします。何かswingのランタイムが配慮してくれない特殊なことでもやらない限りはですが。
guest

0

やることにもよるかも知れませんが・・・

(現在の最新バージョンのswingは)勝手にダブルバッファリングしてくれる気がします。ゆえにダブルバッファリングを意識しなくても多くの場合ちらつきがない結果が得られるのではないかと思います。

AppletViewerでアプレットを動かすとダブルバッファリングの配慮をするかしないかで今でもちらつきの有無が出るような印象ですがAppletってもはや使う機会がないので原因がなぜか調べたことがないです。

そこで・・・

(1) まずは「特に意識せずにやってみる」
(2) どうもちらつくなぁと思ったら、そのコードとともに改めて質問してみる

ということをお奨めします。

https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/JComponent.html#isDoubleBuffered--
このメソッドでJComponentがダブルバッファリング有効状態かどうかを調べることができますが、例えばWindowsではデフォルトでtrueになっているような気がします。

投稿2018/02/27 13:28

KSwordOfHaste

総合スコア18394

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

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

Alpa

2018/02/27 14:02

falseになっていたのですが どうしたらtrueにできるでしょうか?
Alpa

2018/02/27 14:17

JPanelの引数をtrueにしてみても無理でした
KSwordOfHaste

2018/02/27 14:37 編集

失礼しました。説明が不正確でした。多くのJComponent(JButtonとかJLabelとか)は軽量コンポーネントといって「実際の描画は親である重量コンポーネントの描画領域に対して描画される」という特徴を持っています。通常はJPanelがその「重量コンポーネント」にあたり、重量コンポーネントのisDoubleBufferedがtrueならダブルバッファリングが行われるといえると思います。JButtonやJComponentなどはisDoubleBufferedがfalseなんですが、JPanelのデフォルトがtrueになっており、JPanelにぶら下がった部品は「デフォルトでJPanelの働きによってダブルバッファリングが自動的に行われる」といった感じになっていると思います。そういうわけで上の(1)(2)をお奨めしたのです。
KSwordOfHaste

2018/02/27 14:37

ちなみに実際にちらつくのですか?
Alpa

2018/02/27 21:50

はい ちらつきます
KSwordOfHaste

2018/02/28 03:56 編集

何をしているかソースを見た方が早そうです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問