• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JTableのセルにHyperlinkを表示
#navi(../)
#tags(JTable, TableCellRenderer, MouseListener, MouseMotionListener, Html, Desktop)
RIGHT:Posted by &author(aterai); at 2008-12-29
* JTableのセルにHyperlinkを表示 [#f072587c]
---
title: JTableのセルにHyperlinkを表示
tags: [JTable, TableCellRenderer, MouseListener, MouseMotionListener, Html, Desktop]
author: aterai
pubdate: 2008-12-29T01:31:09+09:00
description: JTableのセルの中に、Hyperlinkを表示します。
---
* 概要 [#f072587c]
`JTable`のセルの中に、`Hyperlink`を表示します。

#download
#ref(https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTOF06rk7I/AAAAAAAAAb0/31ZBya_beYk/s800/HyperlinkInTableCell.png)
#download(https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTOF06rk7I/AAAAAAAAAb0/31ZBya_beYk/s800/HyperlinkInTableCell.png)

** サンプルコード [#d5d8fa16]
* サンプルコード [#d5d8fa16]
#code(link){{
class URLRenderer extends DefaultTableCellRenderer implements MouseListener, MouseMotionListener {
  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;
  }
  @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) {
      row = -1;
      col = -1;
    }
    table.repaint();
  }
  @Override public void mouseExited(MouseEvent e)  {
    JTable table = (JTable)e.getSource();
    row = -1;
    col = -1;
    table.repaint();
  }
  @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);
      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) {}
}
}}

** 解説 [#sd316cd4]
* 解説 [#sd316cd4]
`html`タグを使って文字列を修飾するセルレンダラーを作成して使用しています。

#code{{
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()`を使用するようにしました。

** 参考リンク [#ofbb1d91]
* 参考リンク [#ofbb1d91]
- [[Hyperlinkを、JLabel、JButton、JEditorPaneで表示>Swing/HyperlinkLabel]]
- [[Htmlで修飾した文字列のクリップ>Swing/ClippedHtmlLabel]]

** コメント [#v4971191]
- `URLRenderer`のコンストラクタで`JTable`にマウスリスナを追加していたのを修正。 -- [[aterai]] &new{2009-06-25 (木) 12:05:13};
- 「解説」中のコードではコンストラクタに`table`が渡されたままになっているようです。 -- [[yosei]] &new{2010-05-05 (Wed) 16:54:43};
-- コメントありがとうございます。ご指摘のように修正し忘れていました。 -- [[aterai]] &new{2010-05-06 (木) 17:04:59};
* コメント [#v4971191]
#comment
- `URLRenderer`のコンストラクタで`JTable`にマウスリスナーを追加していたのを修正。 -- &user(aterai); &new{2009-06-25 (木) 12:05:13};
- 「解説」中のコードではコンストラクタに`table`が渡されたままになっているようです。 -- &user(yosei); &new{2010-05-05 (Wed) 16:54:43};
-- コメントありがとうございます。ご指摘のように修正し忘れていました。 -- &user(aterai); &new{2010-05-06 (木) 17:04:59};

#comment