java - Haga clic en hipervínculo en jtable?
swing url (2)
¿Cómo puedo habilitar el hipervínculo para cada registro 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 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);
Para solucionar el problema con JTable
consumiendo los eventos, puede agregar su propio MouseListener
(o MouseAdapter
) a JTable
y realizar su manipulación dentro de este oyente. Aquí hay un ejemplo de lo que puedes 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();
}
}
(La pregunta es demasiado vaga para responderla de manera concisa / completa - esta respuesta supone que la parte principal es el hipervínculo en JTable )
Considere usar un marco que sea totalmente compatible con los hipervínculos en los componentes de la colección (tabla, lista, árbol ...) - como fi SwingX
Para un ejemplo de código en SwingX, vea una respuesta reciente
Editar
Pero, ¿qué ocurre si solo una parte de la célula es un hipervínculo, o peor, si hay dos enlaces diferentes en una celda?
Como mencioné en mi comentario: eso no es compatible con SwingX (está basado en células).
Así que volvemos al punto uno con varias opciones
El viejo estilo: (mal) usar un editor de celda
- tener un componente de edición que es / contiene un hipervínculo
- tener un mouseListener que comienza a editar en rollover la celda
- de ahora en adelante, el componente en vivo se ocupa de los eventos de mouse y puede activar las acciones apropiadas en las pulsaciones / clics en el / los hipervínculo / s
Extendiendo el estilo SwingX: enriquezca la interfaz de rollover (la incubadora puede tener ejemplos, pero eso no se agregó al núcleo SwingX por el motivo de que aún no está listo :-) La idea básica es
- agregar "puntos calientes" a la interfaz de rollover
- Mejore (o reemplace) el rolloverProducer para producir notificaciones detalladas una vez que se detecta la celda de rollover-aware
- traduzca la posición del mouse a la celda (componente de representación) coordine y consulte la celda si eso corresponde o no a un punto caliente, si (y solo si) entonces, armar y hacer clic activa la acción
El segundo puede ser implementado independientemente de SwingX, por supuesto: un simple mouseListener personalizado y la lógica de mapeo debería ser el truco (lo siento, no hay código a la mano)