Como criar Link em campo de uma JTable?

9 respostas
R

Eai galera alguem sabe como faz para colocar um link em um campo de uma JTable…tipo se vc clica(tipo web) em um campo(no conteudo do campo), e ele abre um arquivo?

Vlw!!!

9 Respostas

V

Oi.

Já fizemos isso, mas não é trivial.

  1. É necessário criar um filho de JTable. Esse filho fica responsável por capturar eventos do JTable, transformar o cursor na mãozinha, e fazer com que o click gere um evento, ao invés de selecionar a linha;
  2. É necessário criar um CellRenderer, para alterar a cor do campo para azul e sublinhado;
  3. É necessário criar as classes para o mecanismo de eventos em si: A classe do evento, a interface para o listener.
  4. É necessário criar uma classezinha só para marcar uma célula como HyperlinkCell.

Depois disso, você adiciona a sua HyperlinkTable num JFrame. Adiciona um listener para HyperLink nesse frame. O evento te retornará qual o valor da célula clicada. E você também faz o seu model apontar o columnClass da coluna que tem o hiperlink como hyperlink column.

Bom, essa parafernalha toda segue em anexo. Boa sorte.

T

Mto bom, acabou m esclarecendo as idéias p outra funcionalidade.

vlwz.
abraços.

V

De nada, aproveita e olha também esse aqui: http://www.guj.com.br/posts/list/100793.java

T

Parece ser mto interessante.
Já baixei, só nao olharei agora pq to tendo que estudar umas outras coisas, mas amanhã com certeza verei!

Obrigado de novo.
Abraços!

V

Olá,

Baixei o pacote “hyperlink” disponibilizado pelo Vini, mas não consegui utilizá-lo. Eu tento adicionar um listener via os comandos abaixo, mas não obtenho sucesso. Ainda sou inexperiente na linguagem.

Logo após adicionar o JFrame, o JPanel, o JScrollPane e o JTable com seu model, fiz o seguinte:

1ª tentativa:

HyperlinkTableListener listener = null; linkTable.addTableHyperlinkListener(listener);
Na tentativa acima nada acontece com a coluna de hyperlinks na tabela. Talvez por causa do null…

2ª tentativa:

Na 2ª tentativa o erro é óbvio, já que o método hyperlinkClicked() da interface HyperlinkTableListener não foi implementado. Se esta é a maneira correta de adicionar um listener, então não sei como implementar este método.
Eu também não sei como fazer este trecho da explicação do Vini: “E você também faz o seu model apontar o columnClass da coluna…”.

V

É como um listener de botão. Ele vai ser chamado sempre que o Hiperlink for clicado.

Aí você pode fazer o que quiser com isso. Seja usar a classe Desktop para abrir o visualizador padrão do tipo de documento, ou então, abrir alguma tela específica da sua aplicação… enfim, fica a teu critério.

Você não deve mesmo passar null para o listener.

V

Certo. E como faço para indicar que determinada coluna é do tipo HyperlinkCell? Eu só sei obter a informação, com o getColumnClass();

Analisei melhor as classes e acredito que terei de implementar o código responsável por “abrir” o link, correto? No caso este código ficaria dentro do método hyperlinkClicked(). Porém, de qualquer forma, os links não estão aparecendo em fonte de cor azul e sublinhados.

V

Se alguém não entendeu minha dúvida mas puder dar um exemplo de como usar a HyperlinkTable, eu agradeço.
Abaixo segue o que tentei:

JFrame frame = new JFrame(); AnnotationResolver resolver = new AnnotationResolver(Pessoa.class); ObjectTableModel<Pessoa> tableModel = new ObjectTableModel<Pessoa>(resolver, "nome,link"); linkTable = new HyperlinkTable(tableModel); try { tableModel.setData(consultaPessoa(consultaSQL(CONSULTA_PESSOA)); } catch(Exception ex) { System.out.println(ex); } JScrollPane pane = new JScrollPane(); pane.setViewportView(linkTable); JPanel panel = new JPanel(); panel.add(pane); frame.add(panel); frame.setVisible(true); linkTable.addTableHyperlinkListener(new HyperlinkTableListener() { public void hyperlinkClicked(HyperlinkTableEvent e){ if (Desktop.isDesktopSupported()) { Desktop desktop = Desktop.getDesktop(); if (desktop.isSupported(Desktop.Action.BROWSE)) { try { URI uri = new URI("www.google.com.br"); desktop.browse(uri); } catch(IOException | URISyntaxException ex) { ex.printStackTrace(); }}}}});

F

ViniGodoy

Fiz exatamente como explicou não entendi bem foi esse trecho:
if (e.getID() != MouseEvent.MOUSE_CLICKED
                || !isHyperlinkCell(e.getPoint())) {
            super.processMouseEvent(e);
            
            return;
        }

Não consegui fazer o cursor aparecer em forma de mão.

Criado 27 de novembro de 2007
Ultima resposta 13 de ago. de 2014
Respostas 9
Participantes 5