Dado un JTextField
(o cualquier JComponent
para el caso), ¿cómo se podría forzar a que aparezca la información sobre herramientas designada de ese componente, sin ningún evento de entrada directa del usuario? En otras palabras, ¿por qué no hay JComponent.setTooltipVisible(boolean)
?Obligar a que aparezca una información sobre herramientas Java
Respuesta
Necesita invocar la acción predeterminada para mostrar la información sobre herramientas. Por ejemplo, para mostrar un texto de ayuda cuando un componente gana enfoque Se puede agregar la siguiente FocusListener al componente:
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);
}
}
};
Editar:
no parece el código anterior para trabajar más. Otro enfoque es despachar un MouseEvent al componente:
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();
}
});
}
}
Este enfoque dará lugar a un ligero retraso antes de que aparezca la información de herramientas, ya que simula el ratón entra en el componente. Para la visualización inmediata de la información sobre herramientas, puede usar la solución de pstanton.
Tenga en cuenta que con este código, la posición de la información sobre herramientas no está especificada y probablemente no estará debajo del cursor del mouse – dm76
toolTipAction es nulo para mi JButton. ¿Porqué es eso? –
esto no funciona, 'component.getActionMap(). Get (" postTip ");' devuelve nulo para 'JTextField' – pstanton
La única forma (además de la creación de su propia ventana de información sobre herramientas) que he encontrado es emmulate la combinación de teclas CTRL + F1 en el foco:
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();}
}
}
Desafortunadamente, la información sobre herramientas desaparecerá tan pronto como se mueve el puntero del ratón (fuera del componente) o después de un retraso (consulte ToolTipManager.setDismissDelay
).
+1, mi sugerencia original se basó en la tecla F1 que invoca la acción "post-disparo". Pensé que era más claro invocar la Acción directamente en lugar de enviar KeyEvent. No estoy seguro de por qué ya no funciona. – camickr
tooltips están muy mal implementados en java imo. muy inflexible. que tales hacks son necesarios (y difícilmente logran lo que se necesita) muestran que falta la API. – pstanton
¿La plataforma Ctrl + F1 es independiente? ¿Debo esperar que funcione en una Mac igual que Windows? –
Puede acceder al ToolTipManager
, establecer el retraso inicial en 0 y enviar un evento. No te olvides de restaurar los valores después.
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());
}
Para mí funciona la versión similar se ha dicho (en lugar de temporizador Solía SwingUtilities y el enfoque 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);
}
});
}
No es un ToolTip
, pero se puede utilizar un globo: http://timmolderez.be/balloontip/doku.php
Se muestra justo cuando se llama y se siente mejor en unos instantes luego Predeterminado ToolTip
Tenga en cuenta que, a diferencia de la información sobre herramientas, estos globos no pueden salir de la ventana que contiene el componente específico. –
- 1. ¿Hay alguna manera de obligar a Firefox a volver a mostrar un título/información sobre herramientas?
- 2. Anotaciones Java en eclipse Información sobre herramientas?
- 3. Agregar información sobre herramientas a JTextPane
- 4. WPF Enlace a la información sobre herramientas
- 5. JQuery JSTree: agregue una información sobre herramientas
- 6. Cómo agregar información sobre herramientas a jqgrid
- 7. información sobre herramientas vacía tema
- 8. Información sobre herramientas para QPushButton
- 9. Información sobre herramientas en una imagen
- 10. Información sobre herramientas en paneles
- 11. información sobre herramientas para Button
- 12. Información sobre herramientas para elementos CheckedListBox?
- 13. ¿Cómo agregar una información sobre herramientas a un gráfico svg?
- 14. C#: ¿Cómo agrego una información sobre herramientas a un control?
- 15. Cómo agregar información sobre herramientas a td en una tabla
- 16. Cómo agregar información sobre herramientas a las filas de JTable
- 17. ¿Cómo agregar una información sobre herramientas a una celda en un jtable?
- 18. Definir nueva información sobre herramientas en Emacs
- 19. Ocultar información sobre herramientas nativa usando jQuery
- 20. jQuery + información sobre herramientas de contenido ajax
- 21. QTip2 Elementos múltiples, misma información sobre herramientas
- 22. Crear información sobre herramientas para UserControl personalizado
- 23. Primefaces información sobre herramientas para p: selectManyCheckbox
- 24. Información sobre herramientas que no se muestra al pasar el ratón sobre los polígonos SVG
- 25. jqplot formato de información sobre herramientas valores
- 26. información sobre herramientas celular en SlickGrid
- 27. Preservar información sobre herramientas al exportar GraphPlot
- 28. Apagar información sobre herramientas en Eclipse/Aptana
- 29. WPF validador personalizado con información sobre herramientas
- 30. información sobre herramientas para navegadores móviles
Quiere decir que desea t ¿La información sobre herramientas está continuamente visible? Porque eso no es para lo que se usan los tooltips ... – MirroredFate