ツールチップ


コンポーネントの解説

多くのウィンドウシステムはツールチップをサポートしており、ユーザーもそれを知っている
アイコンや表示されている文字だけで直感的にコンポーネントの意味を理解できない場合
ユーザーはコンポーネントの上でマウスカーソルを待機させて
小さな説明ウィンドウの表示を期待するかもしれない

AWT ではこれを自分で独自に開発する必要がありましたが
Swing コンポーネントはツールチップをデフォルトでサポートしています

コンポーネントがツールチップを表示するように設定したい場合は
JComponent クラスの setToolTipText() メソッドを使用します

public void setToolTipText(String text)

text にはツールチップウィンドウに表示させたい文字列を指定します
text に null を指定すると、ツールチップの表示がオフになります

ツールチップはマウスがコンポーネントの上に一定時間乗っていると表示されます
ツールチップは簡素なコンポーネントのヒントに使用する程度の目的です
そのため、改行はサポートされておらず文字列も短くすることが推奨されます
import javax.swing.*;
import java.awt.*;

public class Test extends JApplet {
	public void init() {
		JPanel pl = new JPanel();
		pl.setBackground(Color.black);
		pl.setToolTipText("Kitty on your lap");
		getContentPane().add(pl , BorderLayout.CENTER);
	}
}


コンポーネント上でカーソルを停止させていると、ツールチップが表示されます
この裏では、複雑な処理がカプセル化されて行われています

ツールチップは、Swing が提供する軽量コンポーネントウィンドウです
このコンポーネントは javax.swing.JToolTip クラスで定義されています
java.lang.Object
  |
  +--java.awt.Component
        |
        +--java.awt.Container
              |
              +--javax.swing.JComponent
                    |
                    +--javax.swing.JToolTip
私たちは、普段このコンポーネントを直接操作することはありません
ただし、独自の拡張を備えたツールチップを表示するにはこのクラスを継承します

コンポーネントのツールチップのインスタンス生成のタイミングは
JComponent クラスの createToolTip() メソッドが呼び出されたときです

public JToolTip createToolTip()

このメソッドはツールチップのインスタンスを生成してそれを返します
必要であれば、このメソッドをオーバーライドして独自のツールチップを作ることができます
もっとも、そのような面倒なことを行うことはまずないでしょう
import javax.swing.*;
import java.awt.*;

public class Test extends JApplet {
	public void init() {
		JPanelEx pl = new JPanelEx();
		pl.setBackground(Color.black);
		pl.setToolTipText("Kitty on your lap");
		getContentPane().add(pl , BorderLayout.CENTER);
	}
	class JPanelEx extends JPanel {
		public JToolTip createToolTip() {
			return new JToolTipEx();
		}
	}
	class JToolTipEx extends JToolTip {
		public void paint(Graphics g) {
			setForeground(Color.red);
			super.paint(g);
		}
	}
}


このように、独自の拡張をツールチップに含ませれば
改行をサポートしたり背景色や前景色の指定、アイコンなどを実装できる
より汎用的なサードパーティのツールチップクラスを生成できます


ツールチップの位置

さらに、ツールチップはコンポーネントの位置によって表示する文字を変えることもできます
これは JComponent クラスの getToolTipText() にヒントが隠されています

public String getToolTipText()
public String getToolTipText(MouseEvent event)

これらのメソッドは、現在コンポーネントが表示するツールチップの文字列を返します
event には MouseEvent のインスタンスを渡しますが、プログラムが直接呼び出すことはありません
このメソッドは、ツールチップが表示される時にマウスの位置を計算して文字を返すために使います

コンポーネントにカーソルが停止すると getToolTipText(MouseEvent event) が要求され
(これを要求するのは、後記する ToolTipManager である)
JComponent クラスは getToolTipText(MouseEvent event) が呼び出されると
そのまま return getToolTipText() を呼び出して文字列を返します

ツールチップは最終的にこうして受け取った文字を表示します
この仕様からわかるように getToolTipText(MouseEvent event) はオーバーライドを目的としています
このメソッドをオーバーライドし、受け取った MouseEvent からカーソルの位置を割り出し
位置によって異なる文字列を返せば、場所によって異なるツールチップを表示できます
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Test extends JApplet {
	public void init() {
		JPanelEx pl = new JPanelEx();
		pl.setBackground(Color.black);
		getContentPane().add(pl , BorderLayout.CENTER);
	}
	class JPanelEx extends JPanel {
		public String getToolTipText(MouseEvent e) {
			String str = "Kitty on your lap";
			if ((getSize().width / 2) < e.getPoint().x)
				str = "Tokyo mew mew";
			return str;
		}
		public void paint(Graphics g) {
			Dimension dim = getSize();
			super.paint(g);
			g.setColor(Color.white);
			g.drawLine(dim.width / 2 , 0 , dim.width / 2 , dim.height);
		}
	}
}


このプログラムは getToolTipText(MouseEvent) を拡張することによって
コンポーネントの中央を境目に、異なる文字のツールチップを表示します

さらにツールチップは、表示する位置もこちら側で要求することができる
通常は、マウスカーソルの下側にツールチップが表示されるようになっています
これを変更するには JComponent クラスの getToolTipLocation() を使います

public Point getToolTipLocation(MouseEvent event)

event にはツールチップを表示させる MouseEvent が渡されます
このメソッドも、私たちが呼び出すのではなく Swing によって呼び出されます
このメソッドをオーバーライドし、ツールチップの表示位置を返せばよいのです
null を返せば Swing デフォルトの位置に表示するようになります
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Test extends JApplet {
	public void init() {
		JPanelEx pl = new JPanelEx();
		pl.setBackground(Color.black);
		pl.setToolTipText("Kitty on your lap");
		getContentPane().add(pl , BorderLayout.CENTER);
	}
	class JPanelEx extends JPanel {
		public Point getToolTipLocation(MouseEvent e) {
			Point po = e.getPoint();
			po.y -= 30;
			return po;
		}
	}
}


ツールチップがマウスカーソルの上に表示されていることに注目してください
このように、特定のマウスの位置や固定位置にツールチップを表示することもできます


表示タイミング

ツールチップが表示されるまでの待ち時間や
表示されているあいだの時間の設定を行うこともできます

この表示タイミングなどに関するツールチップの管理はコンポーネントではなく
javax.swing.ToolTipManager クラスが一括してシステムを管理します
java.lang.Object
  |
  +--java.awt.event.MouseAdapter
        |
        +--javax.swing.ToolTipManager
このクラスのインスタンスを得るには sharedInstance() メソッドを使います
この static メソッドはシステムのツールチップを管理するインスタンスを返します

public static ToolTipManager sharedInstance()

ToolTipManager に動作の変更やコンポーネントの追加を依頼する場合
このインスタンスに対して行えば、後はこれまでの動作と同じように
コンポーネントは特別な処理を必要とせずにツールチップを実装できます

カーソルがコンポーネントの上で待機するとタイマが作動し
それから、ツールチップが表示されるまでの時間を初期遅延と呼び
ツールチップが表示されてから消えるまでの時間を消去遅延と呼びます

さらに、カーソルがツールチップを表示しているコンポーネントから外れ
ツールチップのあるコンポーネントに移行した時に即座に表示することがある
この間、コンポーネントからカーソルが外れている時間が長ければすぐには再表示されない
この再表示が有効な場外時間を再表示遅延と呼びます

初期遅延は setInitialDelay() メソッドを使用します
現在の所期遅延時間を得るには getInitialDelay() メソッドを使います
デフォルトでは 750 ミリ秒が初期遅延時間に設定されています

public void setInitialDelay(int microSeconds)
public int getInitialDelay()

microSeconds にはミリ秒単位で初期遅延を指定します
消去遅延の設定は setDismissDelay() で行うことができ
消去遅延の取得は getDismissDelay() メソッドから得ることができます

public void setDismissDelay(int microSeconds)
public int getDismissDelay()

microSeconds には、ミリ秒単位で消去遅延を指定します
最後に、再表示遅延は setReshowDelay() メソッドで設定し
再表示遅延を取得するには getReshowDelay() が有効です

public void setReshowDelay(int microSeconds)
public int getReshowDelay()

microSeconds には、ミリ秒単位で再表示遅延を指定します
import javax.swing.*;
import java.awt.*;

public class Test extends JApplet {
	public void init() {
		JPanel pl = new JPanel();
		pl.setBackground(Color.black);
		pl.setToolTipText("Kitty on your lap");

		ToolTipManager tp = ToolTipManager.sharedInstance();
		tp.setInitialDelay(100);
		tp.setDismissDelay(500);
		getContentPane().add(pl , BorderLayout.CENTER);
	}
}
このプログラムをアプレットビューワで実行すると
ツールチップは一瞬で表示され、かつすぐに消えてしまいます
ToolTipManager を設定することで、システム全体のツールチップに影響を与えられます


ツールチップの無効化

ツールチップはコンポーネントの setToolTipText() に null を渡すことで
そのコンポーネントのツールチップの表示をオフにできる
しかし、この作業は ToolTipManager を使ってシステムレベルで行える

ツールチップの有効/無効の設定は ToolTipManager の setEnabled() を使う
また isEnabled() を使用すれば現在の状態を得ることもできる

public void setEnabled(boolean flag)
public boolean isEnabled()

flag には、有効/無効を指定するブール値を指定する
true であれば有効であり false であれば無効を意味します
isEnabled() は有効であれば true、無効ならば false を返してきます
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Test extends JApplet implements ItemListener {
	public void init() {
		JPanel pl = new JPanel();
		pl.setBackground(Color.black);
		pl.setToolTipText("Kitty on your lap");

		Checkbox chk = new Checkbox("ToolTip" , true);
		chk.addItemListener(this);

		getContentPane().add(chk , BorderLayout.NORTH);
		getContentPane().add(pl , BorderLayout.CENTER);
	}
	public void itemStateChanged(ItemEvent e) {
		Checkbox ch = (Checkbox)e.getItemSelectable();
		ToolTipManager.sharedInstance().setEnabled(ch.getState());
	}
}
このアプレットのチェックボックスをオフにすると
コンポーネントのツールチップが無効化され、表示されなくなります



前のページへ戻る次のページへ