2

ここでのシナリオは次のとおりです。Frame オブジェクトを使用して、AWT (Swing なし) で低レベルのレンダリングを行っています。唯一の問題は、フレームに直接レンダリングする場合、フレームが境界を考慮しないことです。したがって、(0,0) で Rectangle をレンダリングすることは、正しいことをしているようには見えません。これは、(0,0) が Frame のリテラル左上であるためです。

したがって、問題は、次のようにすべてを画面上にレンダリングするためのフレーム インセットを追加する代わりに、次のようになることです。

//This is within the rendering method in the Frame subclass. A buffer strategy is already created
Graphics2D g = (Graphics2D)bufferStrategy.getDrawGraphics();
g.clearRect(0, 0, getWidth(), getHeight());
g.setColor(Color.WHITE);
Insets insets = this.getInsets();
g.drawString("FPS: " + getFPS(), 100 + insets.left, 100 + insets.top); //<-- Ugh.
g.dispose();

フレームの基礎となるグラフィックスにある種のオフセットを簡単に追加できるようにしたいと考えています。これは可能ですか?明確にするために、次のような機能があればいいでしょう。

g.setDrawingOrigin(x, y);

このような方法で、私は殺人を免れることができました。なぜどこかに埋葬されないのかわかりません...

注: JFrame ではなくフレームであるため、参照するコンテンツ ペインがありません。もう 1 つのことは、Frame に他のコンポーネントを追加しないようにすることです。私はこれを可能な限り軽量に保とうとしています (したがって、JFrame の代わりに Frame を使用します。大した違いはありませんが、楽しみましょう :D)。

4

2 に答える 2

3

あなたが探しているメソッドは、Graphic のtranslate(int, int)です。

だからあなたは電話するでしょう、

g.translate(insets.left, insets.top);

もう 1 つの方法は、Frame に直接描画する代わりに、Frame のすべてのスペースに適合して使用する別のコンポーネントを追加してから、そのサブコンポーネントの paint メソッドですべての描画を行うことができます。x と y は期待する場所です。

于 2014-08-10T02:04:36.440 に答える
2

JavaDocs から直接...

フレームのサイズには、ボーダー用に指定されたすべての領域が含まれます。境界領域のサイズは getInsets メソッドを使用して取得できますが、これらのサイズはプラットフォームに依存するため、pack または show を呼び出してフレームが表示可能になるまで、有効な insets 値を取得できません。境界領域はフレーム全体のサイズに含まれているため、境界はフレームの一部を効果的に覆い隠し、レンダリングおよび/またはサブコンポーネントの表示に使用できる領域を、左上隅の位置が (インセット. left, insets.top)、幅 - (insets.left + insets.right) x 高さ - (insets.top + insets.bottom) のサイズを持ちます。

于 2014-08-10T03:39:05.993 に答える