WisdomSoft - for your serial experiences.

5.10 ツールヒント

ツールチップを表示します。ツールチップは、コンポーネント上でカーソルを一定時間止めたときに表示されるテキストです。

5.10.1 コンポーネントのヒント

JComponent クラスを拡張した全ての Swing のコンポーネントは、そのコンポーネントの使い方などを簡単に説明するツールヒントを表示することができます。通常、ツールヒントはマウスのカーソルをコンポーネント上で停止したまま数秒経過すると表示されるように設定されています。

JComponent クラスはツールヒントのテキストを設定する setToolTipText() メソッドと、現在設定されているツールヒントのテキストを返す getToolTipText() メソッドを提供しているため、ツールヒントをコンポーネント上に表示するのはいたって簡単です。

JComponent クラス setToolTipText() メソッド
public void setToolTipText(String text)
JComponent クラス getToolTipText() メソッド
public String getToolTipText()

text に設定した文字列がツールヒントとして表示されます。ツールヒントのテキストに null が設定されている場合はツールヒントがオフの状態であると解釈されます。デフォルトでは null が設定されているため、ツールヒントは表示されません。

コード1
import javax.swing.*;

public class Test extends JComponent {
	public static void main(String args[]) {
		JComponent comp = new Test();
		comp.setToolTipText("Kitty on your lap");

		JFrame win = new JFrame();
		win.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		win.setBounds(10 , 10 , 400 , 300);
		win.getContentPane().add(comp);
		win.show();
	}
}
実行結果
コード1 実行結果

コード1は JComponent を継承している Test クラスのインスタンスを生成し、これに setToolTipText() メソッドからツールヒントのテキストを設定しています。実行結果のように、コンポーネント上でマウスカーソルをホバーさせて一定時間が経過するとツールヒントが表示されます。

5.10.2 位置ごとの文字と表示位置

さらに、JComponent クラスはツールヒントを表示させるより具体的な情報として、位置ごとの文字列を返す getToolTipText() メソッドをオーバーロードしています。このメソッドはツールヒントが表示される直前に呼び出され、マウスカーソルの位置に応じて対応する文字列を返すように設計されています。

JComponent クラス getToolTipText() メソッド
public String getToolTipText(MouseEvent event)

デフォルトで実装されているこのメソッドは setToolTipText() メソッドで設定されたテキストを返します。コンポーネント上の位置に応じて異なるテキストをツールヒントに表示させたい場合、このメソッドをオーバーライドして event パラメータから受け取ったマウスのイベント情報を基にテキストを返すことで実現できます。

また、ツールヒントを表示する位置もコンポーネントが独自に指定することができます。 getToolTipText() メソッド同様に、ツールヒントが表示される直前に JComponent クラスの getToolTipLocation() メソッドが呼び出されます。このメソッドはマウスの座標に対応したツールヒントを表示する座標を返すように設計されています。

JComponent クラス getToolTipLocation() メソッド
public Point getToolTipLocation(MouseEvent event)

ツールヒントの位置に興味がない場合、このメソッドは null を返すと定められています。getToolTipLocation() メソッドが null を返した場合は Swing が適切な位置を判断して表示します。JComponent クラスが実装するデフォルトでは null を返します。

JComponent を継承するクラスでこのメソッドをオーバーライドし、event パラメータから渡されたマウスのイベント情報に対応した独自の Point オブジェクトを返せば、ツールヒントを表示する場所を自由に指定することができます。

コード2
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Test extends JComponent {
	public static void main(String args[]) {
		JFrame win = new JFrame();
		win.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		win.setBounds(10 , 10 , 400 , 300);
		win.getContentPane().add(new Test());
		win.show();
	}

	public Test() { setToolTipText(""); }
	public String getToolTipText(MouseEvent e) {
		if ((getSize().width / 2) > e.getPoint().x) 
			return "Blue Blue Glass Moon,";
		else return "Under the Crimson Air.";
	}
	public Point getToolTipLocation(MouseEvent e) {
		return new Point(0 , 0);
	}
	public void paintComponent(Graphics g) {
		g.setColor(getBackground());
		g.fillRect(0 , 0 , getWidth() , getHeight());
		g.setColor(getForeground());
		g.drawLine(getWidth() / 2 , 0 , getWidth() / 2 , getHeight());
	}
}
実行結果
コード2 実行結果 コード2 実行結果

コード2は、マウスカーソルがホバーしているコンポーネント上の位置に応じて異なるテキストを表示するツールヒントを実現しています。しかも、ツールヒントが表示される位置は常にコンポーネントの左上隅に固定されています。

Test クラスは JComponent クラスを継承し、MouseEvent オブジェクトを受け取る getToolTipText() メソッドをオーバーライドしています。オーバーライドしたメソッドでは、与えられたマウスの座標がコンポーネントの左半分側の場合と、右半分側の場合とで返す文字列を分岐させています。

また、ツールヒントの位置を返す getToolTipLocation() もオーバーライドし、常に座標 (0 , 0) を表す Point オブジェクトを返しているため、ツールヒントは常にコンポーネントの左上隅に表示されるのです。

5.10.3 ツールヒントの管理

ツールヒントが表示されるまでの時間や、ツールヒントが表示されている時間などは、コンポーネントごとにではなく Swing システムによって一元管理されています。ツールヒントを管理しているのは javax.swing.ToolTipManager クラスです。

javax.swing.ToolTipManager クラス
java.lang.Object
  |
  +--java.awt.event.MouseAdapter
        |
        +--javax.swing.ToolTipManager
public class ToolTipManager extends MouseAdapter implements MouseMotionListener

ToolTipManager クラスは、ツールヒントを表示するまでの時間や表示を終了するまでの時間を設定するためのメソッドを提供しています。このクラスのコンストラクタは隠蔽されているため新しくインスタンスを生成することはできません。ToolTipManager のインスタンスは実行単位に常に 1 つであるシングルトンと呼ばれる設計に基づいています。

表1 ToolTipManager クラスのメソッド(抜粋)
メソッド 解説
public static ToolTipManager sharedInstance() ToolTipManager の唯一の共有インスタンスを返します。
public void setInitialDelay(int milliseconds) 初期遅延値をミリ秒単位で指定します。
public int getInitialDelay() 初期遅延値をミリ秒単位で返します。
public void setDismissDelay(int milliseconds) 消去までの遅延時間をミリ秒単位で設定します。
public int getDismissDelay() 消去までの遅延時間をミリ秒単位で返します。
public void setReshowDelay(int milliseconds) 再表示遅延時間をミリ秒単位で設定します。
public int getReshowDelay() 再表示遅延時間をミリ秒単位で返します。
public void setEnabled(boolean flag) ツールヒントを有効または無効にします。
public boolean isEnabled() ツールヒントが有効な場合に true を返します。

ToolTipManager インスタンスを取得するには、ToolTipManager クラスが公開する static メソッド sharedInstance() を呼び出します。このメソッドはシステム内に常に 1 である ToolTipManager インスタンスを返します。

ToolTipManager クラスのツールヒントの設定では、表1に表されている初期遅延時間、消去遅延時間、再表示遅延時間の 3 つに分かれます。初期遅延時間は、コンポーネント上でマウスカーソルがホバーしてからツールヒントが表示されるまでの時間、消去遅延時間は表示されてからツールヒントが消えるまでの時間のことです。

ツールヒントが表示されているコンポーネントからカーソルが離れ、別のツールヒントが表示可能なコンポーネントに移行すると、ツールヒントが遅延なく即座に表示することがあります。この間、コンポーネントからカーソルが外れている時間が再表示遅延時間よりも長ければすぐには再表示されずに初期遅延時間が発生します。

ToolTipManager インスタンスの setEnabled() メソッドを指定すれば、コンポーネントがツールヒントのテキストを持つか持たないかにかかわらず、システム全体でツールヒントを有効にするかどうかを設定することができます。これを false に指定すれば、ツールヒントは一切表示されません。

コード3
import javax.swing.*;

public class Test extends JComponent {
	public static void main(String args[]) {
		JComponent comp = new Test();
		comp.setToolTipText("Kitty on your lap");

		ToolTipManager.sharedInstance().setInitialDelay(100);
		ToolTipManager.sharedInstance().setDismissDelay(1000);

		JFrame win = new JFrame();
		win.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		win.setBounds(10 , 10 , 400 , 300);
		win.getContentPane().add(comp);
		win.show();
	}
}
実行結果
コード3 実行結果

コード3は、ToolTipManager クラスから sharedInstance() メソッドを使って唯一のインスタンスを取得し、初期遅延時間と消去遅延時間の設定を変更しています。プログラムを実行すると、デフォルトよりも素早くツールヒントが表示され、素早くツールヒントが隠されるでしょう。

5.10.4 ツールヒントコンポーネント

コンポーネントに表示されるツールヒントは、直接コンポーネントに描画されているわけではありません。ツールヒントもまた JComponent クラスを継承する軽量コンポーネント javax.swing.JToolTip クラスとして独立しているのです。

javax.swing.JToolTip クラス
java.lang.Object
  |
  +--java.awt.Component
        |
        +--java.awt.Container
              |
              +--javax.swing.JComponent
                    |
                    +--javax.swing.JToolTip
public class JToolTip extends JComponent implements Accessible

ツールヒントとしてコンポーネントに表示されているのはこのクラス、またはそのサブクラスとなります。ところが、JComponent クラスには JToolTip オブジェクトを設定するメソッドはありません。JComponent クラスはツールヒントが必要になると自らの createToolTip() メソッドを呼び出すのです。

JComponent クラス createToolTip() メソッド
public JToolTip createToolTip()

createToolTip() メソッドは JToolTip オブジェクトを返します。JComponent クラスが表示するツールヒントは、このメソッドが返した JToolTip コンポーネントなので、createToolTip() メソッドをサブクラスでオーバーライドし、独自にカスタマイズした JToolTip() オブジェクトを返すようにすれば、ツールヒントの動作や外見を変更することができるようになるでしょう。