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で質問しましょう!
似たような質問が見つかりました
- iOS iPhoneの画面が見切れて困ってます ゲーム画面などで文字が見切れてしまっていたり タップする部分 2 2022/07/05 22:45
- その他(動画サービス) VLCメディアプレーヤーについて 1 2022/11/29 14:19
- その他(プログラミング・Web制作) pythonで、tkinterとpillowの組み合わせ 2 2022/08/16 17:42
- テレビ プレステ5が映らなくりました 1 2023/07/13 11:09
- その他(プログラミング・Web制作) 監視カメラを水平につないでパノラマの映像を作りたい 1 2022/09/06 15:26
- HTML・CSS 【HTML】【CSS】【Swiper】 元の画像は横1200×縦600なのですが、実際のサイト上に反 5 2022/07/16 13:57
- モニター・ディスプレイ Displayport接続時にディスプレイ設定の一部の項目がチラついて変更できない 3 2022/07/31 10:06
- JavaScript javaScriptで画面に値を入れるには 1 2022/08/14 12:27
- Windows 10 ウィンドウズ10で起動画面が真っ暗、修復方法は? 6 2022/03/27 19:28
- HTML・CSS WEBサイトの構築。表示データとWEBデザインを分離する考え方を専門用語・業界用語では何と言うか? 8 2022/09/27 09:16
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB.NETでフォーム上にExcelのよ...
-
[delphi] 変数を利用してコンポ...
-
モーダレスダイアログについて
-
java 電卓 平方根
-
VB.NETでMSComm が追加できず?
-
Visual Basic 2010を使ってRS-2...
-
JButton配列でのイベント処理
-
C++Builder でPanel上にフォー...
-
TableModelListener 通知出し方
-
VBSでCDトレイのオープン/ク...
-
requestFocusについて
-
ゲーム画面(JFrame)のサイズ変...
-
フレーム上のコンポーネントの...
-
ツールボックスのような折りたたみ
-
ファイル保存先のダイアログが...
-
「タイプ初期化子が例外をスロ...
-
次の日本語の意味を教えて下さい
-
エクセルVBAで、条件に一致する...
-
変数名の付け方
-
private static という変数の修飾
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.NETでフォーム上にExcelのよ...
-
ファイル保存先のダイアログが...
-
VB.NETでMSComm が追加できず?
-
Visual Basic 2010を使ってRS-2...
-
requestFocusについて
-
C#で設定時刻到来時にイベント...
-
ツールボックスのような折りたたみ
-
JScrollPane上のJTableの再描画
-
tableView reloadDataが出来ない
-
アクティブなTextFiel...
-
VBでCPUの使用率を取得できます...
-
VB6のツールボックスへのコンポ...
-
[delphi] 変数を利用してコンポ...
-
コンポーネント
-
Buttonの色
-
JButton配列でのイベント処理
-
TableModelListener 通知出し方
-
VBSでCDトレイのオープン/ク...
-
JOptionPaneのダイアログパネル...
-
VisualBasicのコンポーネントで...
おすすめ情報