JTableのセルにHyperlinkを表示
Total: 12153
, Today: 5
, Yesterday: 12
Posted by aterai at
Last-modified:
Summary
JTable
のセルの中に、Hyperlink
を表示します。
Screenshot

Advertisement
Source Code Examples
class UriRenderer extends DefaultTableCellRenderer implements MouseListener, MouseMotionListener {
private int viewRowIndex = -1;
private int viewColumnIndex = -1;
private boolean isRollover;
@Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
Component c = super.getTableCellRendererComponent(
table, value, isSelected, false, row, column);
if (c instanceof JLabel) {
JLabel l = (JLabel) c;
// @see https://ateraimemo.com/Swing/ClippedHtmlLabel.html
// String str = SwingUtilities.layoutCompoundLabel(...);
String str = Objects.toString(value, "");
if (isRolloverCell(table, row, column)) {
l.setText("<html><u><font color='blue'>" + str);
} else if (hasFocus) {
l.setText("<html><font color='blue'>" + str);
} else {
l.setText(str);
}
}
return c;
}
protected boolean isRolloverCell(JTable table, int row, int column) {
return !table.isEditing() && viewRowIndex == row && viewColumnIndex == column && isRollover;
}
private static boolean isUriColumn(JTable table, int column) {
return column >= 0 && table.getColumnClass(column).equals(URI.class);
}
@Override public void mouseMoved(MouseEvent e) {
JTable table = (JTable) e.getComponent();
Point pt = e.getPoint();
int prevRow = viewRowIndex;
int prevCol = viewColumnIndex;
viewRowIndex = table.rowAtPoint(pt);
viewColumnIndex = table.columnAtPoint(pt);
boolean isSameCell = viewRowIndex == prevRow && viewColumnIndex == prevCol;
boolean prevRollover = isRollover;
isRollover = isUriColumn(table, viewColumnIndex);
boolean isNotRollover = isRollover == prevRollover && !isRollover; // && !prevRollover;
if (isSameCell && isNotRollover) {
return;
}
// >>>> HyperlinkCellRenderer.java
// @see https://github.com/sjas/swingset3/blob/master/trunk/SwingSet3/src/com/sun/swingset3/demos/table/HyperlinkCellRenderer.java
Rectangle repaintRect;
if (isRollover) {
Rectangle r = table.getCellRect(viewRowIndex, viewColumnIndex, false);
repaintRect = prevRollover ? r.union(table.getCellRect(prevRow, prevCol, false)) : r;
} else { // if (prevRollover) {
repaintRect = table.getCellRect(prevRow, prevCol, false);
}
table.repaint(repaintRect);
// <<<<
// table.repaint();
}
@Override public void mouseExited(MouseEvent e) {
JTable table = (JTable) e.getComponent();
if (isUriColumn(table, viewColumnIndex)) {
table.repaint(table.getCellRect(viewRowIndex, viewColumnIndex, false));
viewRowIndex = -1;
viewColumnIndex = -1;
isRollover = false;
}
}
@Override public void mouseClicked(MouseEvent e) {
JTable table = (JTable) e.getComponent();
Point pt = e.getPoint();
int col = table.columnAtPoint(pt);
if (isUriColumn(table, col)) {
int crow = table.rowAtPoint(pt);
URI uri = (URI) table.getValueAt(crow, col);
// System.out.println(uri);
try {
// Web Start
// BasicService bs = (BasicService) ServiceManager.lookup("javax.jnlp.BasicService");
// bs.showDocument(uri);
if (Desktop.isDesktopSupported()) {
Desktop.getDesktop().browse(uri);
}
} catch (IOException ex) {
// Logger.getGlobal().severe(ex::getMessage);
UIManager.getLookAndFeel().provideErrorFeedback(e.getComponent());
}
}
}
@Override public void mouseDragged(MouseEvent e) {
/* not needed */
}
@Override public void mouseEntered(MouseEvent e) {
/* not needed */
}
@Override public void mousePressed(MouseEvent e) {
/* not needed */
}
@Override public void mouseReleased(MouseEvent e) {
/* not needed */
}
}
View in GitHub: Java, KotlinExplanation
上記のサンプルでは、JTable
のセル内にリンクを表現するためにhtml
タグを使って文字列を修飾するセルレンダラーを作成して使用しています。
URLRenderer renderer = new URLRenderer();
table.setDefaultRenderer(URL.class, renderer);
table.addMouseListener(renderer);
table.addMouseMotionListener(renderer);