0

私が作成しようとしている効果は、マウスが JPanel の特定のゾーンに入るとマウス カーソル アイコンが変化し、ゾーンを離れるとデフォルトに切り替わることです。MouseMotionListener クラスの MouseMoved 機能を使用しています。この機能は、マウスが JPanel の上を移動するたびに、座標が特別な領域に対応しているかどうかを確認します。

ただ、この方法だとパソコンのプロセッサへの負担が非常に大きいので、もっと効率の良い方法がないか聞きたいと思いました。どんな助けでも大歓迎です。

プログラムが行うことは、JPanel に図を描画することです。[接続] ボタンが選択されている場合、ユーザーが 1 つの図をクリックしてから別の図をクリックすると、それらの図が線で接続されます。

図形は JPanel に描画され、それぞれの領域境界が格納されているため、マウスが移動すると、現在の X 座標と Y 座標がそれらの領域のいずれかの内側にあるかどうかがチェックされ、そうであればカーソルが変更されます。checkValidConnectionRegion は、現在の X 変数と Y 変数が Figure の領域内にあるかどうかを確認します。ハンドラーのコードは次のとおりです。

public void mouseMoved(MouseEvent e)
    {
        if(GUI.Connectionbutton.isSelected())
        {
            x = e.getX();
            y = e.getY();

            checkValidConnectionRegion(); 

            if(validConnectionRegion)
                setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
            if(!validConnectionRegion)
                setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
        }
    }
4

3 に答える 3

5

より効率的なアプローチは、非表示領域として機能JPanelする親JPanelに子を追加することです。次に、カーソルを子の上に置くだけで、その上にJPanel移動するとマウス ポインターが変化します。

JPanel mainPnl = new JPanel(new BorderLayout());

JPanel invisibleArea = new JPanel();
invisibleArea.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
invisibleArea.setPreferredSize(new Dimension(100, 100));

mainPnl.add(invisibleArea, BorderLayout.WEST);
于 2009-08-26T07:19:14.290 に答える
2

私は Java に詳しくありませんが、問題は、Cursor.getPredefinedCursor呼び出すたびに新しいカーソル インスタンスを作成することである可能性があります。(それが本当かどうかはわかりません)

クラスに 2 つのカーソル用に2 つのfinalフィールドを作成し、一度だけ設定してみてください。

validConnectionRegionまた、実際に変更された場合は、カーソルのみを設定してみてください。

例えば:

final Cursor crosshairCursor = Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR);
final Cursor defaultCursor = Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR);

public void mouseMoved(MouseEvent e)
{
    if(GUI.Connectionbutton.isSelected())
    {
        x = e.getX();
        y = e.getY();

        boolean wasValid = validConnectionRegion;
        checkValidConnectionRegion(); 

        if(wasValid != validConnectionRegion)
            setCursor(validConnectionRegion ? crosshairCursor : defaultCursor);
    }
}
于 2009-08-26T20:26:11.737 に答える
2

おそらく、MouseMoved ハンドラーで非効率的なコードを実行しています。

MouseMoved ハンドラーのソース全体を投稿できますか?

于 2009-08-26T05:13:38.350 に答える