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
Trả lời
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.
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
toolTipAction là null cho JButton của tôi. Tại sao vậy? –
điều này không hoạt động, 'component.getActionMap(). Get (" postTip ");' trả về null cho 'JTextField' – pstanton
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
).
+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
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
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? –
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());
}
Đố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);
}
});
}
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
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. –
- 1. Đề xuất cho các chú giải công cụ jQuery
- 2. Bảo tồn Chú giải công cụ khi xuất GraphPlot
- 3. Thay đổi chú giải công cụ của thuộc tính "title" nhanh như thế nào xuất hiện
- 4. Chú giải công cụ cho QPushButton
- 5. Chú giải công cụ nhiều dòng trong Java?
- 6. C# Chú giải công cụ không xuất hiện trên "Hiển thị"
- 7. Chú giải công cụ trên ô. GWT
- 8. Chú giải công cụ trên hình ảnh
- 9. Chú giải công cụ trong .Net
- 10. Chú giải công cụ với Twitter Bootstrap
- 11. cách đóng chú giải công cụ jQuery
- 12. chú giải công cụ cho Nút
- 13. Có cách nào để buộc Firefox hiển thị lại tiêu đề/chú giải công cụ không?
- 14. TinyMCE 4: Cách tắt/ẩn chú giải công cụ?
- 15. Chú giải công cụ cho các mục CheckedListBox?
- 16. Vấn đề định vị chú giải công cụ UI UI
- 17. Làm cách nào để xóa chú giải công cụ hiện được gắn với điều khiển?
- 18. Chú giải công cụ xác thực còn lại trên TabControl
- 19. Chú giải công cụ của "thẻ img" bên trong "thẻ"
- 20. QTip2 Nhiều phần tử, cùng một chú giải công cụ
- 21. Cách thêm chú giải công cụ vào biểu đồ chart.js
- 22. Công cụ jQuery -> Phương pháp tiêu diệt chú giải công cụ?
- 23. Hiển thị chú giải công cụ trong biểu đồ canvas
- 24. Tạo chú giải công cụ cho Custom UserControl
- 25. Thanh trượt Jquery Range với chú giải công cụ
- 26. Cách hiển thị chú giải công cụ khi nhấp chuột
- 27. Xác định chú giải công cụ mới trong Emacs
- 28. Giá trị chú giải công cụ định dạng jqplot
- 29. Phím tắt cho chú giải công cụ Visual Studio/Resharper?
- 30. Thêm chú giải công cụ vào một CStatic
Ý 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