2011-04-08 19 views
5

Estoy tratando de agregar un hipervínculo a un JPanel. Me gustaría hacer que su texto sea azul (y subrayado) y el enlace debería poder seleccionarse (para copiar parte de él). Así que traté de usar JLabel: sí, permiten escribir algo [espantosa] así:¿Es posible crear un hipervínculo seleccionable con componentes Swing básicos en Java?

someLabel.setText("<html><font color=\"#0000ff\"><u>http://example.com</u></font></html>"); 

Pero, por desgracia, JLabel no permite seleccionar cualquier texto. También traté de usar JTextField, pero al contrario, no permite usar HTML/CSS en sus campos.

Entonces, ¿existe alguna forma de crear un hipervínculo (con la indicación adecuada) con componentes Swing básicos, que permitirán seleccionar [y copiar] parte de él, o debo tratar de usar algunos componentes de terceros? Gracias.

Respuesta

5

Es posible visualizar contenido HTML en un no editable JEditorPane . Es seleccionable y puede hacer que los enlaces funcionen a través de un HyperlinkListener:

JEditorPane content = new JEditorPane(); 
    content.setContentType("text/html"); 
    content.setEditable(false); 
    content.setText("<html><a href=\"http://stackoverflow.com\">Link</a></html>")); 
    content.addHyperlinkListener(new HyperlinkListener() { 
     @Override 
     public void hyperlinkUpdate(HyperlinkEvent e) { 
      if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { 
       try { 
        Desktop.getDesktop().browse(e.getURL().toURI()); 
       } catch (Exception e1) { 
        Logger.getLogger(getClass()).error(
          "Error opening link " + e.getURL(), e1); 
       } 
      } 
     } 
    }); 
0

usted tiene que crear una costumbre Jlabel [extender Jlabel] y escribir una MouseListener para la JLabel. El oyente del mouse debe hacer el trabajo de dirigir al usuario al enlace cuando el usuario hace clic en el JLabel personalizado. El evento del mouse [básicamente el método de la interfaz MouseListener donde tiene que escribir el código de redirección] que está buscando es mouseClicked.

+0

Ver mi comentario a 'sfrj'. –

+0

¿Mi solución es incorrecta? Di la solución anterior de crear un componente personalizado en la vista que usará este componente en muchos lugares. Tener el código en una clase como un componente separado facilita la reutilización del código. –

+0

Ese comentario parece no tener conexión con 'enfocable', que es a lo que me refería. (No, su solución es 'correcta', pero sería mejor modificarla un poco.) –

1

aquí cómo se puede crear un JLabel con un hipervínculo, a continuación, puedes añadirlo a su Jpanel:

public HyperLinkLabel() 
{ 
JPanel p = new JPanel(); 
final String strURL = "http://www.yahoo.com"; 
final JLabel label = new JLabel("<html><a href=\" " + strURL + "\"> click </a></html>"); 

final JEditorPane htmlPane = new JEditorPane(); 


p.add(label); 

getContentPane().add(BorderLayout.NORTH, p); 
getContentPane().add(BorderLayout.CENTER, new JScrollPane(htmlPane)); 
setBounds(20,200, 500,500); 

label.addMouseListener(new MouseAdapter() { 
    public void mouseEntered(MouseEvent me) { 
     label.setCursor(new Cursor(Cursor.HAND_CURSOR)); 
    } 
    public void mouseExited(MouseEvent me) { 
     label.setCursor(Cursor.getDefaultCursor()); 
    } 
    public void mouseClicked(MouseEvent me) 
    { 
     System.out.println("Clicked on Label..."); 
     try { 
      htmlPane.setPage(new URL(strURL)); 
     } 
     catch(Exception e) { 
      System.out.println(e); 
     } 
    } 
    }); 
+2

El problema con su ejemplo tal como está, es que no se puede enfocar con el teclado. Aunque tal funcionalidad se agrega fácilmente. 1) Establezca el 'JLabel' enfocable. 2) Agregue un 'FocusListener' que cambie el color del texto (es decir' setForeground (Color) ') en el foco ganado/perdido. También es una buena idea cambiar el 'Color 'en' MouseListener'. –

Cuestiones relacionadas