1

バイオインフォマティクス データを表示するカスタム コンポーネントを作成しています。ユーザーが特定のキーを押したときに、マウスの位置に関する追加情報を表示できるようにしたいと考えています。これは、ツールチップの明らかな仕事のように思えますが、これが機能するのを妨げていると思われる問題がいくつかあります。まず、ツールチップをマウスに追従させ、そのテキストを動的に変更したいと考えています。これは、コンポーネントの getToolTipText と getToolTipLocation をオーバーライドすることである程度機能しますが、マウスの位置が更新されるとツールチップがちらつき、サブコンポーネントの上には表示されません (内部にいくつかの JTextPanes を持つ JPanel です)。また、ToolTipManager を呼び出さずにすぐに表示する方法はないと思います。これにより、他のすべてのコンポーネントの遅延が変わると思います。

これらの問題のいくつかには回避策があるようですが、かなり複雑で洗練されていないため、独自のコンポーネントを作成し、関連情報を入力して自分で表示することをお勧めします。ただし、これはある種の最上位コンポーネントである必要があります。これは、親コンポーネントまたは含まれる JFrame の境界をわずかに超えて拡張し、他のすべての上に描画できる必要があるためです。JToolTip 以外でこの機能を持つオブジェクトとして私が知っているのは、JFrame と JDialog だけです。これらには、私が望まないタイトルと閉じるボタンの境界線があります。これを達成する方法はありますか?

4

1 に答える 1

3

1 つのオプションは、ガラス板を使用することです。この場合、ツールチップはフレームの外に出ることはできませんが、フレームの側面にどれだけ近いかを基準にして簡単に配置できます。マウスに追従するバブル (ペイント メソッドでテキストを入力できます) を描画するサンプル コード。

    public static void main(String[] args)
{
    JFrame frame = new JFrame();
    frame.setSize(new Dimension(500, 500));

    JPanel glassPane = new JPanel();
    glassPane.setOpaque(false);
    glassPane.setLayout(null);

    frame.setGlassPane(glassPane);
    frame.getGlassPane().setVisible(true);


    final MyInfoBubble mib = new MyInfoBubble();
    mib.setBounds(10, 30, 100, 50);
    ((JPanel)frame.getGlassPane()).add(mib);

    frame.getContentPane().addMouseMotionListener(new MouseMotionAdapter() {

        public void mouseMoved(MouseEvent me) {
            mib.setBounds(me.getPoint().x, me.getPoint().y, 100, 50);
        }
    });

    ((JPanel)frame.getGlassPane()).validate();
    ((JPanel)frame.getGlassPane()).repaint();

    frame.setVisible(true);
}



static class MyInfoBubble extends JPanel
{
    public MyInfoBubble()
    {
        setVisible(true);
    }


    public void paintComponent(Graphics g)
    {
        Graphics2D g2d = (Graphics2D)g;
        g2d.setColor(Color.BLUE);
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.fillRoundRect(0, 0, getWidth(), getHeight(), 20, 20);
    }

}
于 2012-11-01T20:21:09.867 に答える