2011-06-24 5 views
14

JTextField(またはそれに関係なくJComponent)を指定すると、ユーザーからの直接的な入力イベントなしに、そのコンポーネントの指定されたツールチップがどのように表示されますか?つまり、なぜJComponent.setTooltipVisible(boolean)が存在しないのですか?Java Tooltipを表示させる

+0

デフォルト彼はツールチップを連続して見ることができますか?これはツールチップが使用されるものではないからです... – MirroredFate

答えて

4

ツールチップを表示するには、デフォルトのアクションを呼び出す必要があります。たとえば、コンポーネントの利益はあなたがコンポーネントに次のFocusListenerを追加することができます焦点を当てたときにツールチップを表示する:

FocusAdapter focusAdapter = new FocusAdapter() 
{ 
    public void focusGained(FocusEvent e) 
    { 
     JComponent component = (JComponent)e.getSource(); 
     Action toolTipAction = component.getActionMap().get("postTip"); 

     if (toolTipAction != null) 
     { 
      ActionEvent postTip = new ActionEvent(component, ActionEvent.ACTION_PERFORMED, ""); 
      toolTipAction.actionPerformed(postTip); 
     } 

    } 
}; 

を編集:

上記のコードは、もはや動作していないようです。別のアプローチは、コンポーネントにMouseEventの派遣である:それはコンポーネントを入力するマウスをシミュレートして、ツールチップが表示される前に

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class PostTipSSCCE extends JPanel 
{ 
    public PostTipSSCCE() 
    { 
     FocusAdapter fa = new FocusAdapter() 
     { 
      public void focusGained(FocusEvent e) 
      { 
       JComponent component = (JComponent)e.getSource(); 

       MouseEvent phantom = new MouseEvent(
        component, 
        MouseEvent.MOUSE_MOVED, 
        System.currentTimeMillis(), 
        0, 
        10, 
        10, 
        0, 
        false); 

       ToolTipManager.sharedInstance().mouseMoved(phantom); 
      } 
     }; 

     JButton button = new JButton("Button"); 
     button.setToolTipText("button tool tip"); 
     button.addFocusListener(fa); 
     add(button); 

     JTextField textField = new JTextField(10); 
     textField.setToolTipText("text field tool tip"); 
     textField.addFocusListener(fa); 
     add(textField); 

     JCheckBox checkBox = new JCheckBox("CheckBox"); 
     checkBox.setToolTipText("checkbox tool tip"); 
     checkBox.addFocusListener(fa); 
     add(checkBox); 
    } 

    private static void createAndShowUI() 
    { 
     JFrame frame = new JFrame("PostTipSSCCE"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new JScrollPane(new PostTipSSCCE())); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowUI(); 
      } 
     }); 
    } 
} 

このアプローチは、わずかな遅延が発生します。ツールチップをすぐに表示するには、pstantonのソリューションを使用します。私が見つけた

+0

このコードでは、ツールチップの位置は指定されておらず、ほとんどマウスカーソルの下にはありません。 – dm76

+0

JButtonではtoolTipActionがnullです。何故ですか? –

+0

これは動作しません。 'component.getActionMap()。get(" postTip ");'は 'JTextField'に対してnullを返します。 – pstanton

5

(独自のツールチップウィンドウを作成する以外に)唯一の方法は、焦点にCTRL + F1キーストロークをemmulateすることです:

new FocusAdapter() 
{ 
    @Override 
    public void focusGained(FocusEvent e) 
    { 
     try 
     { 
      KeyEvent ke = new KeyEvent(e.getComponent(), KeyEvent.KEY_PRESSED, 
        System.currentTimeMillis(), InputEvent.CTRL_MASK, 
        KeyEvent.VK_F1, KeyEvent.CHAR_UNDEFINED); 
      e.getComponent().dispatchEvent(ke); 
     } 
     catch (Throwable e1) 
     {e1.printStackTrace();} 
    } 
} 

残念ながら、ツールチップはできるだけ早くあなたのマウスを移動すると消えます(部品の外側)または遅れた後(ToolTipManager.setDismissDelayを参照)。

+0

+1、私の元の提案は、 "postTip"アクションを呼び出すF1キーに基づいていました。 KeyEventを送出するのではなく、Actionを直接呼び出す方がきれいだったと思いました。なぜそれがもう動作しないのか分かりません。 – camickr

+0

ツールチップは本当にひどくjava imoで実装されています。非常に柔軟性がない。そのようなハッキングが必要である(そして必要なものをほとんど達成しない)ことは、APIが欠けていることを示している。 – pstanton

+0

Ctrl + F1プラットフォームは独立していますか? Windowsと同じMacでも動作するはずですか? –

0

ToolTipManagerにアクセスし、初期遅延を0に設定してイベントを送信します。後で値を復元することを忘れないでください。私にとって

private void displayToolTip() 
{ 
    final ToolTipManager ttm = ToolTipManager.sharedInstance(); 
    final MouseEvent event = new MouseEvent(this, 0, 0, 0, 
              0, 0, // X-Y of the mouse for the tool tip 
              0, false); 
    final int oldDelay = ttm.getInitialDelay(); 
    final String oldText = textPane.getToolTipText(event); 
    textPane.setToolTipText("<html><a href='http://www.google.com'>google</a></html>!"); 
    ttm.setInitialDelay(0); 
    ttm.setDismissDelay(1000); 
    ttm.mouseMoved(event); 

    new Timer().schedule(new TimerTask() 
    { 
     @Override 
     public void run() 
     { 
      ttm.setInitialDelay(oldDelay); 
      textPane.setToolTipText(oldText); 
     } 
    }, ttm.getDismissDelay()); 
} 
1

(代わりに、タイマーの私はSwingUtilitiesとinvokeLaterのアプローチを使用)上記で述べたと同様のバージョンで動作します:

private void showTooltip(Component component) 
{ 
    final ToolTipManager ttm = ToolTipManager.sharedInstance(); 
    final int oldDelay = ttm.getInitialDelay(); 
    ttm.setInitialDelay(0); 
    ttm.mouseMoved(new MouseEvent(component, 0, 0, 0, 
      0, 0, // X-Y of the mouse for the tool tip 
      0, false)); 
    SwingUtilities.invokeLater(new Runnable() 
    { 
     @Override 
     public void run() 
     { 
      ttm.setInitialDelay(oldDelay); 
     } 
    }); 
} 
0

それはToolTipではありませんが、あなたはバルーンヒントを使用することができます http://timmolderez.be/balloontip/doku.php

それだけでコールに示すと、いくつかの瞬間に、より良い感じている、あなたはあなたがトン望むわけToolTip

+0

ツールチップとは異なり、これらのバルーンは対象コンポーネントを含むウィンドウを終了できません。 –

関連する問題