2011-07-03 27 views
10

Quiero agregar algunas sugerencias sobre herramientas solo a un texto determinado dentro de un JTextPane. Como ejemplo, si hay un texto de enlace de referencia dentro de JTextPane, quiero agregar una información sobre herramientas a ese texto para mostrar el enlace. ¿Hay alguna manera de que pueda lograr esta funcionalidad?Agregar información sobre herramientas a JTextPane

Respuesta

8

Buena pregunta.

primer golpe compatible con HTML, por lo que para mostrar información sobre herramientas con enlace sólo hay que decir:

comp.setToolTipText("<html><a href='http://www.google.com'>google</a></html>");

El problema es hacer esto se puede hacer clic sobre herramientas.

Lamentablemente, Swing no lo hace.

Tooltip es creado por ToolTipManager. Cuando se llama a setToolTipText() JComponent añade la instancia de sí mismo a instancia compartida del gestor de información sobre herramientas que se encarga de mostrar la información sobre herramientas (utilizando el método show() que no puede ser anulado. No se puede cambiar el gestor de información sobre herramientas en sí también.

Por lo tanto, la mejor solución que puedo sugerir es hacer lo siguiente. puede escuchar los eventos AWT usando Toolkit.getDefaultToolkit().addAWTEventListener()

lo tanto, cuando sobre herramientas se mostró atraparlo, descubrir y poner detector de ratón en él. Este detector de ratón hará que la se puede hacer clic en la información sobre herramientas.

Este es el ejercicio que acabo de escribir. Puede usar como referencia Buena suerte.

public static void main(String[] args) throws InterruptedException, InvocationTargetException { 
     final JFrame f = new JFrame("test"); 
     f.setSize(100, 100); 


     JLabel l = new JLabel("<html><a href='http://www.google.com'>google</a></html>"); 
     l.setToolTipText("<html><a href='http://www.google.com'>google</a></html>"); 


     long mask = AWTEvent.COMPONENT_EVENT_MASK | 
//  AWTEvent.CONTAINER_EVENT_MASK | 
//  AWTEvent.FOCUS_EVENT_MASK | 
//  AWTEvent.KEY_EVENT_MASK | 
//  AWTEvent.MOUSE_EVENT_MASK | 
//  AWTEvent.MOUSE_MOTION_EVENT_MASK | 
     AWTEvent.WINDOW_EVENT_MASK | 
     AWTEvent.ACTION_EVENT_MASK | 
     AWTEvent.ADJUSTMENT_EVENT_MASK | 
     AWTEvent.ITEM_EVENT_MASK | 
     AWTEvent.TEXT_EVENT_MASK; 

     Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() { 
      @Override 
      public void eventDispatched(AWTEvent event) { 
       int id = event.getID(); 
       Object source = event.getSource(); 
       if (id == 101 && source instanceof JToolTip) { 
        JToolTip tooltip = (JToolTip)source; 

        //System.out.println("" + event.getID() + " " + event.getSource()); 

       } 

      } 
     }, mask); 
     f.add(l); 
     f.setVisible(true); 
    } 
2

Puede intentar cargar páginas HTML en el jtextpane. Here es un ejemplo. Puede encontrar más explicaciones sobre este ejemplo here

1

Puede agregar un TooltipText a un JComponent, como un JTextPane, no a palabras o partes del Componente.

Normalmente, un JTextPane puede contener enlaces múltiples, entonces, ¿para qué debería el TooltipText mostrar el enlace?

Pero puede agregar un Listener al JTextPane, y eliminar la información sobre herramientas anterior, y agregar una nueva, si detecta un enlace.

6

Anular: método getToolTipText (Evento MouseEvent) del panel de texto.

Al utilizar MouseEvent, puede usar el método viewToModel (...) para obtener el más alto en el documento. Luego puede obtener los atributos para determinar si está pasando el mouse sobre un enlace.

O tal vez un enfoque más fácil es utilizar el método getCursor(). Cuando el cursor es el cursor de la mano, está sobre un enlace.

Luego, puede devolver el texto apropiado de la información sobre herramientas para el enlace actual.

Cuestiones relacionadas