2011-06-24 45 views
14

Cho một JTextField (hoặc bất kỳ JComponent cho vấn đề đó), làm thế nào người ta có thể bắt buộc tooltip của thành phần đó xuất hiện mà không có sự kiện nhập trực tiếp nào từ người dùng? Nói cách khác, tại sao không có JComponent.setTooltipVisible(boolean)?Bắt buộc chú giải công cụ Java để xuất hiện

+0

Ý bạn là bạn muốn anh ta có thể nhìn thấy chú giải công cụ liên tục không? Vì đó không phải là những chú giải công cụ được sử dụng cho ... – MirroredFate

Trả lời

4

Bạn cần gọi Hành động mặc định để hiển thị chú giải công cụ. Ví dụ để hiển thị một tooltip khi tăng thành phần tập trung bạn có thể thêm FocusListener sau đây để các thành phần:

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); 
     } 

    } 
}; 

Edit:

Đoạn mã trên dường như không có tác dụng nữa. Một cách tiếp cận khác là gửi một MouseEvent đến thành phần:

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(); 
      } 
     }); 
    } 
} 

Cách tiếp cận này sẽ dẫn đến một chút chậm trễ trước khi tooltip được hiển thị khi nó mô phỏng chuột vào thành phần. Để hiển thị ngay lập tức chú giải công cụ, bạn có thể sử dụng giải pháp của pstanton.

+0

Lưu ý rằng với mã này, vị trí của chú giải công cụ không được chỉ định và rất có thể sẽ không nằm dưới con trỏ chuột – dm76

+0

toolTipAction là null cho JButton của tôi. Tại sao vậy? –

+0

điều này không hoạt động, 'component.getActionMap(). Get (" postTip ");' trả về null cho 'JTextField' – pstanton

5

Cách duy nhất (bên cạnh việc tạo ra cửa sổ Tooltip của riêng bạn) Tôi đã tìm thấy là emmulate các tổ hợp phím CTRL + F1 trên tập trung:

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();} 
    } 
} 

Thật không may, tooltip sẽ biến mất ngay khi bạn di chuyển chuột (bên ngoài thành phần) hoặc sau khi trì hoãn (xem ToolTipManager.setDismissDelay).

+0

+1, đề xuất ban đầu của tôi dựa trên phím F1 gọi hành động "postTip". Tôi nghĩ rằng nó là sạch hơn để gọi hành động trực tiếp hơn là gửi KeyEvent. Không chắc tại sao nó không hoạt động nữa. – camickr

+0

các chú giải công cụ thực sự được triển khai trong java imo. rất không linh hoạt. rằng hacks như vậy là cần thiết (và hầu như không đạt được những gì là cần thiết) cho thấy api là thiếu. – pstanton

+0

Nền tảng Ctrl + F1 có độc lập không? Tôi có nên mong đợi nó hoạt động trên máy Mac giống như Windows không? –

0

Bạn có thể truy cập ToolTipManager, đặt độ trễ ban đầu là 0 và gửi sự kiện. Đừng quên khôi phục các giá trị sau đó.

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

Đối với tôi làm việc với phiên bản tương tự như đã nêu ở trên (thay vì hẹn giờ tôi sử dụng SwingUtilities và cách tiếp cận 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

Nó không phải là một ToolTip, nhưng bạn có thể sử dụng một tip bóng: http://timmolderez.be/balloontip/doku.php

Nó chỉ hiển thị khi có cuộc gọi và cảm thấy tốt hơn trong giây lát, sau đó, Mặc định ToolTip

+0

Lưu ý rằng không giống như chú giải công cụ, các bong bóng này không thể thoát khỏi cửa sổ chứa thành phần được nhắm mục tiêu. –

Các vấn đề liên quan