0

ユーザーがダイアグラム上を移動したとき ( -> ダイアグラムの名前を表示する ) およびユーザーがダイアグラム上を移動しなかったとき ( - > ダイアグラムの名前を表示しないでください )。しかし、これにより、アプリケーションの実行時に大きな遅延が発生します (画面の再描画が非常に遅く、遅延があり、再描画される前に毎回 1 秒ほど画面が空白になり、再描画に時間がかかります)。

これらは、それに関するコードの部分です。

 public void mouseMoved(MouseEvent e) {
  this.checkDiagramHovered(e.getX(),e.getY());
 }

ダイアグラムがホバーされたかどうかを確認し、ダイアグラムがホバーされたかどうかを変数に設定する関数を呼び出します。ホバーされている場合は、どのダイアグラムがホバーされたか (表示する名前、実行する x と y の位置)、アプリを再描画します。したがって、基本的に、マウスの動きが行われるたびにアプリを再描画して、ユーザーがダイアグラム上を移動したときにのみダイアグラムの名前が表示されるようにします。ただし、これにより、画面が大幅に遅れ、途切れ途切れの再描画が発生します。

今、私は疑問に思っていました:これを解決する最善の方法は何ですか? マウスの動きをチェックするために何らかの遅延を実装する必要がありますか?

前もって感謝します、

スカイフェ。

4

3 に答える 3

1

Java Swing を使用していると仮定します。

checkDiagramedHoveredUI の応答性を維持できるように、ユーザー インターフェイス スレッドからメソッドを取り出す必要があります。

public void mouseMoved(MouseEvent e) {
   Thread thread = new Thread(new Runnable()
       public void run() {
           this.checkDiagramHovered(e.getX(),e.getY());
       }
    );
    thread.start();
}

UI メソッドがある場合checkDiagramedHoveredは、UI スレッドで実行する必要があります。

SwingUtilities.invokeLater(new Runnable()
    public void run() {
        (UI method call)
    }
);
于 2010-10-31T14:15:50.980 に答える
0

swing と awt では、すべてのイベント (マウス、キーボード) とペイントが同じスレッドで行われます。repaint を呼び出しているときに、そのスレッドに新しいジョブを送信すると、最終的に実際に paint が呼び出されます。描画関数に時間がかかりすぎると、そのスレッド (AWT イベント キュー スレッド) がビジー状態になり、マウス イベントを処理できなくなり、遅延が発生します。あなたが説明したちらつきの問題は、ペイント機能が遅いことも示唆しています。

できることがいくつかあります。 1. ダブル バッファリングを使用します。これにより、ちらつきは解決されますが、ラグは解決されません。2. 別のスレッドで実際のレンダリングを行い、そのスレッドによって準備されたオフスクリーン イメージを awt スレッドに描画させます。これにより、両方の問題が解決されます。

つまり、ダブル バッファリングとは、オフスクリーン イメージを作成してそこにペイントし、Graphics.drawImage() を使用してイメージ全体を一度にペイントすることを意味します。

于 2010-10-31T16:20:42.017 に答える
0

AWT ではなく、Swing を使用します。Swing は、最近誰もが使用する AWT の拡張機能です。次に、 Tool Tipを使用できます。画像を表示するコンポーネントの getToolTipText(...) メソッドをオーバーライドする必要があります。

于 2010-10-31T16:05:26.230 に答える