java swing hyperlink swingx jxtable

java - HyperLinks en la columna JXTable, rellenado desde la base de datos



swing swingx (1)

Mi pregunta es cómo puedo hacer que los hipervínculos de una columna JXTable (solo para una / columna específica) funcionen como enlaces "_blank" de mi navegador web de escritorio predeterminado.

Uso JXTable y DefaultTableModel, también llamo a los datos de una base de datos sqlite. Hice la investigación en internet, google, [...] y encontré mucha información que dice, si no me equivoco:

  • registrar un MouseListener en JXTable;
  • generar objeto de punto desde MouseEvent;
  • obtener el texto a través de getValueAt

*** Nota: La columna tiene solo 1 enlace por celda, sin texto, solo el enlace.

Por ahora he implementado este código para realizar una acción donde se hace doble clic en una celda. Por favor, alguien me puede ayudar a implementar una columna de hipervínculos que se abre en el navegador predeterminado como en este ejemplo (pero no sé cómo adaptarlo porque los datos no son llamados desde una base de datos).

Table_Employee.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) { JXTable target = (JXTable)e.getSource(); int row = target.getSelectedRow(); int column = target.getSelectedColumn(); JFrame newFrame = new JFrame(); //I want to open an distinc link newFrame.setTitle("Detail Screen"); //for every cell along one column newFrame.setVisible(true); //in the web browser, not a frame. } } });

EDITAR 1 El código de EDIT 2 de @Kleopatra tiene algunos problemas para mi aplicación. Además, hice otra prueba como el siguiente código, y listo: los enlaces están ahí cuando el primer clic está involucrado, pero no reaccionan (no hay un navegador abierto). @Kleopatra, ¿me puede dar más información sobre su sugerencia, porque cuando intento poner ese código, el IDE no reconoce hyperlinkColumn ?

Table_Employee.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 1) { JXTable target = (JXTable)e.getSource(); int row = target.getSelectedRow(); int column = target.getSelectedColumn(); AbstractHyperlinkAction<Object> simpleAction = new AbstractHyperlinkAction<Object>(null) { public void actionPerformed(ActionEvent e) { //open the browser event? } }; TableCellRenderer renderer = new DefaultTableRenderer( new HyperlinkProvider(simpleAction)); Table_Employee.getColumnExt(2).setEditable(false); Table_Employee.getColumnExt(2).setCellRenderer(renderer); } } });


sin oyentes involucrados, SwingX tiene un Proveedor de hipervínculo que simplemente configura con una acción según sea necesario:

JXTable table = new JXTable(myModel); AbstractHyperlinkAction<Object> simpleAction = new AbstractHyperlinkAction<Object>(null) { public void actionPerformed(ActionEvent e) { // here goes what you want to do on activating the hyperlink //LOG.info("hit: " + getTarget()); } }; TableCellRenderer renderer = new DefaultTableRenderer( new HyperlinkProvider(simpleAction)); table.getColumnExt(0).setEditable(false); table.getColumnExt(0).setCellRenderer(renderer);

Tenga en cuenta que la columna no debe ser editable para admitir automáticamente hipervínculos.

Editar 2

Si desea abrir el navegador / cliente de correo, utilice un HyerlinkProvider configurado con una SwingX HyperlinkAction. Esto está respaldado por Core DesktopAction. Su objetivo debe ser de tipo URI, luego detecta automáticamente si abrir uno u otro.

Puedes instalarlo manualmente por columna:

TableCellRenderer renderer = new DefaultTableRenderer( new HyperlinkProvider(new HyperlinkAction())); table.getColumnExt(0).setEditable(false); table.getColumnExt(0).setCellRenderer(renderer);

De hecho, es aún más simple: JXTable ya lo tiene como predeterminado para la clase URI. Todo lo que tiene que hacer es implementar su modelo de manera que contenga uris e informe que, como su clase de columna:

DefaultTableModel model = new DefaultTableModel(...) { @Override Class<?> getColumnClass(int column) { if (column == hyperlinkColumn) { return URI.class; } ... // handle other columns return super.getColumnClass(column); } @Override boolean isCellEditable(int row, int column) { if (column == hyperlinkColumn) { return false; } ... // handle other columns return super.isCellEditable(row, column); } }

Para ver ese soporte en acción, es lo mismo para JXList / JXTree, ejecute la demostración web de SwingLabs : los ejemplos están en varias páginas, fi JXTable, Hyperlink / extended, Highlighter y revise el código que viene con él