Swing/HyperlinkInTableCell のバックアップの現在との差分(No.8)
TITLE:JTableのセルにHyperlinkを表示
Posted by aterai at 2008-12-29
JTableのセルにHyperlinkを表示
JTableのセルの中に、Hyperlinkを表示します。-
category: swing
folder: HyperlinkInTableCell
title: JTableのセルにHyperlinkを表示
tags: [JTable, TableCellRenderer, MouseListener, MouseMotionListener, Html, Desktop, Hyperlink]
author: aterai
pubdate: 2008-12-29T01:31:09+09:00
description: JTableのセルの中に、Hyperlinkを表示します。
image:
hreflang:
href: https://java-swing-tips.blogspot.com/2009/02/hyperlink-in-jtable-cell.html lang: en
概要
JTable
のセルの中に、Hyperlink
を表示します。
- &jnlp;
- &jar;
- &zip;
Screenshot
Advertisement
サンプルコード
#spanend
#spandel
class URLRenderer extends DefaultTableCellRenderer implements MouseListener, MouseMotionListener {
#spanend
#spanadd
* サンプルコード [#sourcecode]
#spanend
#spanadd
#code(link){{
#spanend
#spanadd
class URLRenderer extends DefaultTableCellRenderer implements MouseInputListener {
#spanend
private int row = -1;
private int col = -1;
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus,
int row, int column) {
super.getTableCellRendererComponent(table, value, isSelected, false, row, column);
if(!table.isEditing() && this.row==row && this.col==column) {
setText("<html><u><font color='blue'>"+value.toString());
}else if(hasFocus) {
setText("<html><font color='blue'>"+value.toString());
}else{
@Override public Component getTableCellRendererComponent(
JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
super.getTableCellRendererComponent(
table, value, isSelected, false, row, column);
if (!table.isEditing() && this.row == row && this.col == column) {
setText("<html><u><font color='blue'>" + value.toString());
} else if (hasFocus) {
setText("<html><font color='blue'>" + value.toString());
} else {
setText(value.toString());
}
return this;
}
public void mouseMoved(MouseEvent e) {
JTable table = (JTable)e.getSource();
#spanadd
#spanend
@Override public void mouseMoved(MouseEvent e) {
JTable table = (JTable) e.getSource();
Point pt = e.getPoint();
row = table.rowAtPoint(pt);
col = table.columnAtPoint(pt);
if(row<0 || col<0) {
if (row < 0 || col < 0) {
row = -1;
col = -1;
}
table.repaint();
}
public void mouseExited(MouseEvent e) {
JTable table = (JTable)e.getSource();
#spanadd
#spanend
@Override public void mouseExited(MouseEvent e) {
JTable table = (JTable) e.getSource();
row = -1;
col = -1;
table.repaint();
}
public void mouseClicked(MouseEvent e) {
JTable table = (JTable)e.getSource();
#spanadd
#spanend
@Override public void mouseClicked(MouseEvent e) {
JTable table = (JTable) e.getSource();
Point pt = e.getPoint();
int crow = table.rowAtPoint(pt);
int ccol = table.columnAtPoint(pt);
//if(table.convertColumnIndexToModel(ccol) == 2)
if(table.getColumnClass(ccol).equals(URL.class)) {
URL url = (URL)table.getValueAt(crow, ccol);
// if (table.convertColumnIndexToModel(ccol) == 2)
if (table.getColumnClass(ccol).equals(URL.class)) {
URL url = (URL) table.getValueAt(crow, ccol);
System.out.println(url);
//try{
// Desktop.getDesktop().browse(url.toURI());
//}catch(Exception ex) {
// ex.printStackTrace();
//}
try {
Desktop.getDesktop().browse(url.toURI());
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
public void mouseDragged(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
#spanadd
#spanend
@Override public void mouseDragged(MouseEvent e) {
/* not needed */
}
#spanadd
#spanend
@Override public void mouseEntered(MouseEvent e) {
/* not needed */
}
#spanadd
#spanend
@Override public void mousePressed(MouseEvent e) {
/* not needed */
}
#spanadd
#spanend
@Override public void mouseReleased(MouseEvent e) {
/* not needed */
}
}
解説
htmlタグを使って文字列を修飾するセルレンダラーを作成して使用しています。解説
上記のサンプルでは、JTable
のセル内にリンクを表現するためにhtml
タグを使って文字列を修飾するセルレンダラーを作成して使用しています。
URLRenderer renderer = new URLRenderer();
table.setDefaultRenderer(URL.class, renderer);
table.addMouseListener(renderer);
table.addMouseMotionListener(renderer);
- - 上記のサンプルでは、クリックしてもリンク先には接続せず、System.out.println(table.getValueAt(crow, ccol));で文字列を表示しているだけです。
参考リンク
参考リンク
コメント
- URLRendererのコンストラクタでJTableにマウスリスナを追加していたのを修正。 -- aterai
- 「解説」中のコードではコンストラクタにtableが渡されたままになっているようです。 -- yosei?
- コメントありがとうございます。ご指摘のように修正し忘れていました。 -- aterai
コメント
-
URLRenderer
のコンストラクタでJTable
にマウスリスナーを追加していたのを修正。 -- aterai - 「解説」中のコードではコンストラクタに
table
が渡されたままになっているようです。 -- yosei- コメントありがとうございます。ご指摘のように修正し忘れていました。 -- aterai