Swing/HyperlinkInTableCell のバックアップの現在との差分(No.13)
-
category: swing
folder: HyperlinkInTableCell
title: JTableのセルにHyperlinkを表示
tags: [JTable, TableCellRenderer, MouseListener, MouseMotionListener, Html, Desktop]
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
を表示します。
Screenshot
Advertisement
サンプルコード
サンプルコード
#spandel
class URLRenderer extends DefaultTableCellRenderer
#spanend
implements MouseListener, MouseMotionListener {
#spanadd
class URLRenderer extends DefaultTableCellRenderer implements MouseInputListener {
#spanend
private int row = -1;
private int col = -1;
@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;
}
#spanadd
#spanend
@Override public void mouseMoved(MouseEvent e) {
JTable table = (JTable)e.getSource();
JTable table = (JTable) e.getSource();
Point pt = e.getPoint();
row = table.rowAtPoint(pt);
col = table.columnAtPoint(pt);
if (row < 0 || col < 0) {
row = -1;
col = -1;
}
table.repaint();
}
#spanadd
#spanend
@Override public void mouseExited(MouseEvent e) {
JTable table = (JTable)e.getSource();
JTable table = (JTable) e.getSource();
row = -1;
col = -1;
table.repaint();
}
#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.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();
}
}
}
@Override public void mouseDragged(MouseEvent e) {}
@Override public void mouseEntered(MouseEvent e) {}
@Override public void mousePressed(MouseEvent e) {}
@Override 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 */
}
}
View in GitHub: Java, Kotlin解説
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));
で文字列を表示しているだけです。Java 6
以上を対象にすることにしたので、Desktop.getDesktop().browse()
を使用するようにしました。