
JFrameを使ってノベルゲームを制作しています。
機能としてJFrameをリサイズできるようにしたいと思っています。
方法としては二つあると思ってます
(1)ベースとなる構築された画面をイメージとして扱い、それを伸縮してJFrameにあわせる。
(2)JFrameに合わせて画面のパーツの大きさをそれぞれ設定し構築していく。
(2)の方法だと縦横比が崩れたときの処理をぱっとは思いつかない(ノベルゲームなのですが、文が出るパネルが縦横比の崩れた変化をすると文字がはみ出たりする恐れがある気が・・)ので、(1)の方法をとりたいと思っています。
不可視のJFrame(以後BufferFrame)をつくり、そこでコンポーネントなどを貼り付けたりしておく。BufferFrameのImageオブジェクトを取得し、基盤クラス(JFrameを継承)のdrawImage(略)で伸縮して張り付けることによって実現できるかなと思いましたが、肝心なImageオブジェクトの取得の方法が分かりません。
createImage(int, int)というメソッドかなと思ったのですがうまくいきませんでした。
質問としては、「ゲーム画面のリサイズ処理としてこれが正しいのか」というのと正しいならば、「具体的にどのようにそれを実現すれば良いのか」という二点です。
もし分かる方がいらっしゃればご教示願います。
No.2ベストアンサー
- 回答日時:
要するに、JFrameのWindow内の表示をImageとして取り出せないか、ということでしょうか。
JFrame自体は内部的にオフスクリーンバッファに表示イメージを描画していますので、どこかにイメージデータは保持しているとは思いますが、残念ながらそれを簡単に取り出すメソッドやフィールドなどは用意されていません。ですので、簡単に取り出す方法はありません。
どうしてもというなら、Robotクラスを使ってWindow内のイメージをキャプチャーする、という荒業はあります。こんな感じですね。
Robot robot = new Robot();
Rectangle captureSize = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
BufferedImage bufferedImage = robot.createScreenCapture(captureSize);
ただ、意味がないと思いますが。既に表示の各部品をコンポーネント化し、それぞれでリサイズに対応するように設計できているようですから、それが正しいアプローチだと思います。せっかくコンポーネント化されたものを全体でひとまとめに扱うというのは、コンポーネント化に反する無意味なアプローチのように思えます。
No.1
- 回答日時:
要するに、Imageをファイルから作成する方法、ということですか。
いろいろやりかたはありますが、私の場合はImageIO.readを使うやり方が一番てっとり早くて楽ですね。例えばこんな感じです。BufferedImage img = ImageIO.read(new File("image.png"));
>ゲーム画面のリサイズ処理としてこれが正しいのか
これは、それぞれの設計の仕方によるでしょうから、、これが正しいというものはないように思いますよ。ただ、Swingなどは部品のコンポーネント化が進められていて、それぞれのコンポーネントごとに独立して扱えるようにするのが基本だろうと思います。
ですから、イメージを利用するにしても、画面全体を1枚の絵で貼り付けるより、例えば「メニューのパネル」「ゲームシーンのパネル」「メッセージの表示パネル」というように画面に表示される部品ごとにコンポーネント化して、それぞれの中でリサイズ時の処理などを実装していくと良いと主ますよ。
この回答への補足
回答ありがとうございます。
説明下手ですみません。ファイルからImageを作成する方法ではなく、JFrameに表示されている(みえている)画面からImageを作成する方法があるかどうかが分からないのです。
指南してくださった各コンポーネントでリサイズの処理をする・・ はたった今なんとかできました!そういう意味ではリサイズは出来るようになったわけですが、もともと目指していたのとはちょっと違います。
具体的な話をすると、背景を表示させるパネルや、メッセージを表示するパネル(JFrameの上に乗ってる子JPanel)をJFrame上に乗せて画面を構築させてます。その関係を保ったままリサイズをしたいと思っていました。例えば横にびよーんと画面を伸ばしたら画面内のパネルや文字も全部びよーんと横に歪み平ぺったくなる、という処理です。それを実現するためには文字やパネルなどの全てをイメージとして扱うことができれば手っ取り早いと思ったのです。
リサイズは出来るようになったのでこんな質問は必要ないと思われるかもしれませんが、
もしよろしければその点についてご教示願います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SwingでのGroup作成
-
VB.NETでフォーム上にExcelのよ...
-
文字の色の変更
-
VS2010デザイナーの読込エラー...
-
VBSでCDトレイのオープン/ク...
-
requestFocusについて
-
C++ Builder でVisibleとshow
-
コントロールの表示・非表示
-
「タイプ初期化子が例外をスロ...
-
エクセルVBAで、条件に一致する...
-
中学のクラス数
-
0歳児の指しゃぶりに関して
-
スーパークラスからサブクラス...
-
変数名の付け方
-
標準モジュールとクラスモジュ...
-
関数内の変数に<summary>コメン...
-
僕の出身中学校は200人同級生が...
-
引数で日付を2つ与え、その間の...
-
UMLのクラス図はmain()も含むん...
-
エクセルVBAにおけるON TIMEメ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.NETでフォーム上にExcelのよ...
-
VB.NETでMSComm が追加できず?
-
ファイル保存先のダイアログが...
-
VB6のツールボックスへのコンポ...
-
C#で設定時刻到来時にイベント...
-
JScrollPane上のJTableの再描画
-
Visual Basic 2010を使ってRS-2...
-
TableModelListener 通知出し方
-
JButton配列でのイベント処理
-
フレーム上のコンポーネントの...
-
VBのAxtiveXコントロール製品を...
-
requestFocusについて
-
java gui のイベント処理が重い
-
[delphi] 変数を利用してコンポ...
-
C++Builder でPanel上にフォー...
-
C#で参照したCOMコンポーネント...
-
delphi stringgrid
-
VBSでCDトレイのオープン/ク...
-
文字の色の変更
-
文字装飾可能なテキストエディ...
おすすめ情報