- PR -

Swingのツールチップが消えない

1
投稿者投稿内容
gt@0C9
会議室デビュー日: 2006/01/24
投稿数: 6
投稿日時: 2006-01-24 17:02
どうもSwingのマウスイベントの不具合っぽいんですが、ある操作をすることでツールチップが表示されたままになります。

コード:
public class Test {
  public static void main(String[] args) {
    ToolTipManager manager = ToolTipManager.sharedInstance();
    manager.setInitialDelay(0);
    manager.setDismissDelay(10000);
    manager.setReshowDelay(0);

    JLabel label = new JLabel("テスト") {
      public Point getToolTipLocation(MouseEvent event) {
        Dimension d = event.getComponent().getSize();
        Point p = new Point(0, d.height);
        return p;
      }
    };
    label.setBackground(Color.RED);
    label.setOpaque(true);
    label.setBounds(0, 0, 45, 20);
    label.setToolTipText("てすと");
    
    JFrame frame = new JFrame();
    frame.getContentPane().setLayout(null);
    frame.add(label);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(400, 500);
    frame.setVisible(true);
  }
}



テストプログラムを実行して、マウスをラベルの上から下にツールチップの上も通る様に、すばやく動かすとツールチップが消えません。
ToolTipManager#setDismissDelayで、時間が経つと消えるのですが、本当ならラベルからマウスカーソルが離れた時に消えてほしいです。
この現象を解決する方法って存在するのでしょうか?
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2006-01-24 17:22
ToolTipManager をいじったり getToolTipLocation をオーバーライドしたりせずに単にJLabel にツールチップの表示を任せるのではだめでしょうか?
getToolTipLocation をオーバーライドして何をしようとしているのでしょうか?

コード:
public class Test {
  public static void main(String[] args) {
    JLabel label = new JLabel("テスト") ;
    label.setBackground(Color.RED);
    label.setOpaque(true);
    label.setBounds(0, 0, 45, 20);
    label.setToolTipText("てすと");

    JFrame frame = new JFrame();
    frame.getContentPane().setLayout(null);
    frame.add(label);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(400, 500);
    frame.setVisible(true);
  }
}

gt@0C9
会議室デビュー日: 2006/01/24
投稿数: 6
投稿日時: 2006-01-24 17:37
すばやい返答ありがとうございます。
引用:

インギさんの書き込み (2006-01-24 17:22) より:
ToolTipManager をいじったり getToolTipLocation をオーバーライドしたりせずに単にJLabel にツールチップの表示を任せるのではだめでしょうか?
getToolTipLocation をオーバーライドして何をしようとしているのでしょうか?


テストコードは現象を確認しやすくする為に、getToolTipLocation をオーバーライドしました。単にJLabel にツールチップの表示を任せた場合でも、ツールチップの上を通るようにマウスカーソルを左上から右下に動かすと、ツールチップが消えなくなります。

調査している理由は、
消えないのは何故だ? 消えないのはおかしい、と問い詰められているからです。
個人的にはしばらくすれば消えるし、どうでもいいことなんですが…

[ メッセージ編集済み 編集者: gt@0C9 編集日時 2006-01-24 18:11 ]
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2006-01-24 20:55
gt@0C9さんが提示されたコードでも、インギさんが提示されたコードでも、どちらでも再現しますね。(Windows 98 + JDK 1.4.2 あたりで試しました。)
引用:

gt@0C9さんの書き込み (2006-01-24 17:37) より:
調査している理由は、
消えないのは何故だ? 消えないのはおかしい、と問い詰められているからです。
個人的にはしばらくすれば消えるし、どうでもいいことなんですが…


JDK に付属の demo/jfc の下にある SwingSet2 でも発生しました。
Swing のただのバグなんでしょうね。
SwingSet2 でも起きるのだから「Java/Swing の仕様です」でいいのではないでしょうか。
gt@0C9
会議室デビュー日: 2006/01/24
投稿数: 6
投稿日時: 2006-01-24 21:09
引用:

unibonさんの書き込み (2006-01-24 20:55) より:
gt@0C9さんが提示されたコードでも、インギさんが提示されたコードでも、どちらでも再現しますね。(Windows 98 + JDK 1.4.2 あたりで試しました。)
引用:

gt@0C9さんの書き込み (2006-01-24 17:37) より:
調査している理由は、
消えないのは何故だ? 消えないのはおかしい、と問い詰められているからです。
個人的にはしばらくすれば消えるし、どうでもいいことなんですが…


JDK に付属の demo/jfc の下にある SwingSet2 でも発生しました。
Swing のただのバグなんでしょうね。
SwingSet2 でも起きるのだから「Java/Swing の仕様です」でいいのではないでしょうか。


それが通ればこんな苦労はしてないです

結局シンボルとツールチップが、ある程度離れていれば発生しないようなので、getToolTipLocation でマウスポインタの位置を利用して、常に右斜め下にツールチップが出るようにしました。
それでも画面の右端だとやばかったりするのですが、流石にそれはどうしようもないと突っぱねます。こういう細かいところで、Swingはやっぱり実践向きではないよなぁ…
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2006-01-24 21:57
引用:

gt@0C9さんの書き込み (2006-01-24 21:09) より:
結局シンボルとツールチップが、ある程度離れていれば発生しないようなので、getToolTipLocation でマウスポインタの位置を利用して、常に右斜め下にツールチップが出るようにしました。


解決されているようなので、以下は、余談になるかもしれませんが。

確かめていませんが、こういうのはマウスを素早く動かすとやはり発生するのではないでしょうか?
変にアプリケーション側で小細工するよりも Swing のバグを修正したほうが、手っ取り早いし、確実のような気もします。が、でも、Swing のソースコードを見るとやっぱり、複雑っぽい気もします。
javax.swing.ToolTipManager をいじる(extends してバグ対策のコードを追加する)と、良さそうな気もするのですが、どなたかよろしく。
(ToolTip の問題ではなく、もっと低レベルな Mouse の enter/leave のイベントの問題かもしれません。昔、Swing を使っていて、イベントが起きないなあ、と思った時もあったような。enter がなくていきなり dragged が発生することもあったような。あいまいな記憶ですが。)

Bug Parade に投稿して気長に待つのも手ですね。
gt@0C9
会議室デビュー日: 2006/01/24
投稿数: 6
投稿日時: 2006-01-26 11:16
一応Bug Reportに提出しておきました。
多分、一年くらい経った後に最新バージョンではどうだい? みたいなメールが来て終わりのような気がしますが…
gt@0C9
会議室デビュー日: 2006/01/24
投稿数: 6
投稿日時: 2006-01-31 11:50
バグデータベースに登録されました
外部のデータベースに現れるには、1,2日かかるみたいです。

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6378466

SwingerはVoteよろしくお願いします
1

スキルアップ/キャリアアップ(JOB@IT)