2009-07-27 14 views
23

Estoy tratando de establecer información sobre herramientas en un JEditorPane. El método que utilizo para determinar qué texto de información sobre herramientas mostrar es bastante intensivo en la CPU, por lo que me gustaría mostrarlo solo después de que el mouse se haya detenido por un corto período de tiempo, digamos 1 segundo.Establezca el tiempo de demora de información sobre herramientas para un componente particular en Java Swing

Sé que puedo usar ToolTipManager.sharedInstance().setInitialDelay(), sin embargo, esto establecerá el tiempo de demora para la información sobre herramientas en todos los componentes oscilantes a la vez y no quiero esto.

+0

¿Qué se hace presente en la descripción que no se puede calcular en un subproceso de fondo? – akarnokd

+0

Algunos ejemplos de código pueden ser útiles. Quizás podría dar un ejemplo de lo que estoy hablando. – jjnguy

+0

Quiero cambiar el contenido de la información sobre herramientas dependiendo de qué palabra está pasando el usuario. La tarea de rellenar el contenido de la información sobre herramientas es bastante cara, por lo que solo quiero realizar ese cálculo si el usuario se ha estancado con una palabra. – Scottm

Respuesta

6

Bueno, yo recomendaría hacer la tarea intensiva de la CPU en otro hilo para que no interrumpa las tareas normales de la GUI.

Esa sería una solución mejor. (En lugar de tratar de eludir el problema)

* Editar * lo que pueda calcular las tootips por cada palabra en el JEditorPane y almacenarlos en una Map. Entonces, todo lo que tendría que hacer es acceder al tootip del Map si cambia.

Lo ideal es que las personas no muevan el mouse y tipeen al mismo tiempo. Por lo tanto, puede calcular los tootlips cuando el texto cambia, y simplemente extraerlos del Map en mouseMoved().

+0

Su edición es una muy buena sugerencia. No estoy seguro de si funcionará porque en realidad es un depurador en el que estoy trabajando y, por lo tanto, los valores que se ponen en el mapa están sujetos a cambios; sin embargo, es una gran idea. Creo que su sugerencia de calcular el valor en un hilo también es buena. – Scottm

+0

Sí, estoy de acuerdo: alguna forma de almacenar en caché la respuesta mientras el mouse se mueve y recuperarla cuando el usuario se detenga podría resolver mi problema. Voy a intentarlo mañana. Estableceré tu respuesta para que sea aceptada. Gracias por tu ayuda. – Scottm

3

Puede mostrar la ventana emergente usted mismo. Escuchar para mouseMoved() eventos, iniciar/detener el temporizador y luego mostrar emergente con el siguiente código:

Lo primero que necesita PopupFactory, emergente, y sobre herramientas:

private PopupFactory popupFactory = PopupFactory.getSharedInstance(); 
private Popup popup; 
private JToolTip toolTip = jEditorPane.createToolTip(); 

a continuación, para mostrar u ocultar la información sobre herramientas :

private void showToolTip(MouseEvent e) { 
    toolTip.setTipText(...); 
    int x = e.getXOnScreen(); 
    int y = e.getYOnScreen(); 
    popup = popupFactory.getPopup(jEditorPane, toolTip, x, y); 
    popup.show(); 
} 

private void hideToolTip() { 
    if (popup != null) 
     popup.hide(); 
} 

Esto le dará retardo ajustable y un montón de problemas :)

+0

En mi caso, si coloca el cursor sobre un ícono al comienzo de la barra de estado, aparece una información sobre herramientas con los mensajes pasados ​​'n'. Mientras mantenga el mouse dentro de los límites de la información sobre herramientas, permanecerá.Pero quería controlar todos los aspectos de tiempo sin cambiar los tiempos globales de información sobre herramientas. En mi opinión, su solución parece ser una alternativa mucho mejor que la respuesta aceptada, pero ¡ojalá! Son solo mis dos centavos? Gracias por esta solución Piligrim, ¡lo intentaré muy pronto! – Jeach

+0

No he visto este hilo durante mucho tiempo, pero me gusta su sugerencia. Nunca tuve la oportunidad de terminar este proyecto, así que intentaré esto de nuevo pronto. Le daré una oportunidad a tu idea :) – Scottm

23

Si lo que desea es hacer que la información sobre herramientas despedir demora mucho más tiempo para una específica componente, entonces este es un buen truco:

(felicitaciones a tecnología en http://tech.chitgoks.com/2010/05/31/disable-tooltip-delay-in-java-swing/)

private final int defaultDismissTimeout = ToolTipManager.sharedInstance().getDismissDelay(); 

addMouseListener(new MouseAdapter() { 

    public void mouseEntered(MouseEvent me) { 
    ToolTipManager.sharedInstance().setDismissDelay(60000); 
    } 

    public void mouseExited(MouseEvent me) { 
    ToolTipManager.sharedInstance().setDismissDelay(defaultDismissTimeout); 
    } 
}); 
+0

+1, pero hice un cambio. Me tomó obtener el tiempo de espera predeterminado fuera de 'mouseEntered()', porque tiene el potencial de arruinar las cosas si está configurando DefaultDismissTimeout varias veces (¿qué pasa si el usuario tiene múltiples componentes uno al lado del otro donde han cambiado el tiempo de espera? Podrían perder por completo el tiempo de espera predeterminado moviéndose de uno a otro.) Idealmente, parece que el valor predeterminado deDismissTimeout debería ser un lugar global para garantizar que se establezca solo una vez, en la inicialización de la aplicación completa. – ArtOfWarfare

+0

@ArtOfWarfare, en el blog vinculado, defaultDismissTimeout se marcó como final, lo que supongo es cómo superaron la configuración múltiple. –

+0

@BuhBuh - Edité la respuesta aquí para tomar el DefaultDismissTimeout por defecto del oyente, pero en el código real que escribí en base a esta respuesta, decidí convertirlo en una variable final estática para mi componente. Si desea ver los valores reales que son predeterminados, eche un vistazo a las líneas 85-91 aquí: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6- b14/javax/swing/ToolTipManager.java – ArtOfWarfare

Cuestiones relacionadas