0

私は、JavaSwingコンポーネントを使用してGUIベースのゲームアプリケーションをプログラムしようとしている最中です。基本的なフレームワークは次のとおりです。aとaJFrameを含むA。さらに、それ自体が2つを含む2つの層を含むを含みます。(不思議なことに、この2つは、最上部の不透明でないパネルのユニットペインと、最下部の不透明なパネルの地形ペインに対応しています。)JScrollPaneJPanelJScrollPaneJPanelJLayeredPaneJPanelsJPanels

自動ウィンドウスクロールは、現状のプログラムの機能です。明確にするために、記述されたコードは、ウィンドウターゲットとして適切なユニットを自動的に指定し、ウィンドウ表示を前提として、そのユニットを画面の中央位置にできるだけ近く表示するように、表示されているウィンドウをスクロールします。制約。この手順が私のジレンマの原因です。ウィンドウのサイズを変更する前に行われたメソッドの呼び出しを除いて、特定のメソッドの実行では、メソッドは正しく機能します。メソッドが正しく機能しないのは、アプリケーションの最初の起動時のみです。

私のコードは長すぎてこの投稿のコンテキストで完全に投稿できないと思うので、最初はウィンドウスクロールを処理するコードのみを提供し、次に必要に応じてパブリックDropBoxアカウントに追加のコードを投稿します。

private void scrollWindowToUnit(int targetUnit) {
    System.out.println(((GenericUnit) unitsPane.getComponent(targetUnit))
            .getUnitName());
    int upLeftX = unitsPane.getLocation().x;
    int upLeftY = unitsPane.getLocation().y;
    Point scrollDest = new Point(unitsPane.getComponent(targetUnit)
            .getLocation().x - (screenSize.width / 2), unitsPane
            .getComponent(targetUnit).getLocation().y
            - ((screenSize.height - infoPane.getHeight()) / 2) + 24);

    if (scrollDest.x < upLeftX) {
        scrollDest.x = upLeftX + 24;
    }

    if (scrollDest.y < upLeftY) {
        scrollDest.y = upLeftY + 24;
    }

    jScrollPane.getViewport().setViewPosition(scrollDest);

    repaint();
    revalidate();
}

私はすでにこのメソッドのかなり堅牢なテストを完了しており、結果は次のとおりです。アプリケーションを最初に起動したとき、upLeftXと内に保持されている値upLeftYは両方とも-24に設定されています。これは、プログラムの実行全体を通じて一貫しています。(それぞれが負の値に設定されているのはかなり奇妙ですが、十分に管理しやすいようです。)ただし、範囲内の値scrollDestは、プログラムの最初の起動とその後の実行の間で異なります。基本的に、発生するのは、コードが-24未満の負の整数であるscrollDest.xおよびscrollDest.yの値を取得することです。

printステートメントを含む簡単な例の実行後、次の結果が出力されました。

scrollDest.xおよびy:-800 -336

scrollDest.xおよびy:0 0

scrollDest.xおよびy:1051 2145

scrollDest.xおよびy:1051 2145

scrollDest.xおよびy:610 -312

scrollDest.xおよびy:610 0

この行は、上記のメソッドの2つのステートメントのSystem.out.println("scrollDest.x and y: " + scrollDest.x + " " + scrollDest.y); 前後の両方に配置されました。if値は、便宜上ONEと呼ばれるユニットでのプログラムによるメソッドの最初の呼び出し、ボード上の別のユニットでのプログラムによる2番目の呼び出し、TWOを反映し、最後にメソッドの3番目の呼び出しが1回続きます。再びONEに。

この不一致は私の問題の根本または反映のいずれかであり、私はまだ問題を修正するための信頼できる方法を考案していません。

説明や詳細についての質問には喜んでお答えします。よろしくお願いします!

4

1 に答える 1

2

の一部を中央に配置するかどうかわからない場合JComponentsJViewport、2 つの を計算することで可能です(Rectanglerect返しますJComponentrect2JViewport

JScrollPane.scrollRectToVisible(new Rectangle(rect.x, rect.y, 
    (int) rect2.getWidth(), (int) rect2.getHeight()));

しかし、最も簡単なのは

JScrollPane.scrollRectToVisible(myDesiredComponents.getBounds());

JScrollPaneへのすべてのイベントは、イベント ディスパッチ スレッドで実行する必要があることに注意してください。

于 2013-02-20T07:01:41.507 に答える