2010-11-23 29 views
5

¿Cómo puedo habilitar el hipervínculo para cada registro en el JTable?Haga clic en hipervínculo en jtable?

Lo que quiero hacer es que un usuario pueda hacer clic en el hipervínculo que luego mostrará la información que puede editar/actualizar.

Alternativamente, ¿cómo puedo habilitar la edición in situ de los datos de la tabla?

Otra pregunta es que actualmente estoy usando la siguiente manera para mostrar diferentes pantallas. Pero esta no es una manera elegante, entiendo que deberíamos usar Cardlayout, pero ¿cómo hacerlo exactamente?

mainPanel.setVisible(false); 
createBlogEntryPanel.setVisible(true); 
setComponent(createBlogEntryPanel); 
+1

se puede probar con: .setText ("About"); –

+0

¿Desea abrir la url determinada en el navegador? ¿o algo mas? – Kowser

Respuesta

9

Para abordar el problema con el consumo de JTable los eventos, puede añadir su MouseListener (o una MouseAdapter) a la JTable y hacer su manipulación dentro de este oyente. Aquí está un ejemplo de lo que puede lograr:

public class Main extends JFrame { 

public Main() { 
    super(); 

    DefaultTableModel dt = new DefaultTableModel(
      new String[][] { { "http://google.com" }, { "http://gmail.com" } }, new String[] { "Url" }); 
    final JTable t = new JTable(dt); 

    t.addMouseListener(new MouseAdapter() { 
     @Override 
     public void mouseClicked(MouseEvent e) { 
      int row = t.rowAtPoint(new Point(e.getX(), e.getY())); 
      int col = t.columnAtPoint(new Point(e.getX(), e.getY())); 
      System.out.println(row + " " + col); 

      String url = (String) t.getModel().getValueAt(row, col); 
      System.out.println(url + " was clicked"); 
      // DO here what you want to do with your url 
     } 

     @Override 
     public void mouseEntered(MouseEvent e) { 
      int col = t.columnAtPoint(new Point(e.getX(), e.getY())); 
      if (col == 0) { 
       t.setCursor(new Cursor(Cursor.HAND_CURSOR)); 
      } 
     } 

     @Override 
     public void mouseExited(MouseEvent e) { 
      int col = t.columnAtPoint(new Point(e.getX(), e.getY())); 
      if (col != 0) { 
       t.setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); 
      } 
     } 
    }); 

    add(new JScrollPane(t)); 

    t.getColumnModel().getColumn(0).setCellRenderer(new TableCellRenderer() { 

     @Override 
     public Component getTableCellRendererComponent(JTable table, final Object value, boolean arg2, 
       boolean arg3, int arg4, int arg5) { 
      final JLabel lab = new JLabel("<html><a href=\"" + value + "\">" + value + "</a>"); 
      return lab; 
     } 
    }); 

    setSize(700, 500); 
    setLocationRelativeTo(null); 
    setVisible(true); 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 
} 

public static void main(String[] args) { 
    try { 
     UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    new Main(); 
} 

} 
+0

¿Pero qué sucede si solo una parte de la celda es un hipervínculo, o peor, si hay 2 enlaces diferentes en una celda? – javamonkey79

+0

En ese caso, aún puede usar SwingX como se menciona en @kleopatra. ¡Es una muy buena biblioteca! – aymeric

+1

@ javamonkey79 desafortunadamente, no es compatible con SwingX (está basado en la celda al igual que esta respuesta) – kleopatra

3

(La pregunta es demasiado vaga para responder de manera concisa/por completo - esta respuesta asuma la parte principal de ser el hipervínculo en JTable)

Considere usar un marco que sea totalmente compatible con hipervínculos en los componentes de la colección (tabla, lista, árbol ...) - como fi SwingX

Para un ejemplo de código en SwingX, ver una Edición recent answer

Pero lo que si sólo una parte de la célula es un hipervínculo, o peor aún, si hay 2 enlaces diferentes en ¿Una célula?

Como mencioné en mi comentario: esto no es compatible con SwingX (está basado en células).

Así que es hora de volver al punto de partida con varias opciones

El 'estilo ol: (mal) uso de un cellEditor

  • tienen una editingComponent cuales es/contiene un hipervínculo
  • tienen una MouseListener que comienza a editar en rollover la celda
  • a partir de ahora el componente vivo se ocupa de mouseEvents y puede activar las acciones apropiadas en las pulsaciones/clics en el/los hipervínculo

Extendiendo estilo SwingX: enriquecer la interfaz de vuelco (la incubadora puede tener ejemplos, pero que no se agregó al núcleo SwingX por la razón de no estar listo :-) La idea básica es

  • añadir "puntos calientes" de la interfaz de vuelco
  • mejorar (o sustituir) el rolloverProducer para producir notificaciones de grano más fino una vez que se detecta la célula de vuelco consciente
  • traducir el mousePosition a la célula (componente de representación) coordina y consultar la célula si eso corresponde o no a un punto caliente, si (y solo si) así, arme y haga clic en desencadenar el actio n

La segunda puede ser implementado independientemente de SwingX, por supuesto: la costumbre de un ol llano' MouseListener y la lógica de mapeo debe hacer el truco (lo siento, no hay código práctico)

+0

Sí, solo estoy buscando agregar hipervínculos a una JTable. No hice una pregunta duplicada, así que agregué recompensa a esta. Estoy bien usando JXTable si funciona; Lo comprobaré. – javamonkey79

+0

No estoy del todo seguro de poder hacerlo sin swingx, ya que la antigua JTable simple consume eventos de clic del mouse, no parece delegarlos en componentes secundarios. Sin embargo, podría estar haciendo algo mal. En cualquier caso, simplemente ignoré los casos de uso más complicados por el momento y usé el swingx con toda la columna enlazada. – javamonkey79