TITLE:JTableのセルにHyperlinkを表示

Posted by aterai at 2008-12-29

JTableのセルにHyperlinkを表示

JTableのセルの中に、Hyperlinkを表示します。

  • &jnlp;
  • &jar;
  • &zip;
HyperlinkInTableCell.png

サンプルコード

class URLRenderer extends DefaultTableCellRenderer implements MouseListener, MouseMotionListener {
  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{
      setText(value.toString());
    }
    return this;
  }
  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();
  }
  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();
    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();
      //}
    }
  }
  public void mouseDragged(MouseEvent e) {}
  public void mouseEntered(MouseEvent e) {}
  public void mousePressed(MouseEvent e) {}
  public void mouseReleased(MouseEvent e) {}
}

解説

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