Swing/HyperlinkInTableCell のバックアップの現在との差分(No.7)
- バックアップ一覧
- 差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- バックアップ を表示
- Swing/HyperlinkInTableCell へ行く。
- 1 (2008-12-29 (月) 01:31:09)
- 2 (2009-01-07 (水) 19:22:46)
- 3 (2009-06-24 (水) 09:57:22)
- 4 (2009-06-25 (木) 12:04:38)
- 5 (2010-05-06 (木) 10:54:43)
- 6 (2010-05-06 (木) 17:03:27)
- 7 (2010-05-07 (金) 13:50:03)
- 8 (2011-05-06 (金) 18:48:36)
- 9 (2012-01-27 (金) 17:29:06)
- 10 (2013-01-13 (日) 19:27:45)
- 11 (2014-06-20 (金) 18:54:18)
- 12 (2014-11-01 (土) 00:32:15)
- 13 (2014-11-21 (金) 18:32:57)
- 14 (2014-12-06 (土) 20:45:22)
- 15 (2015-02-17 (火) 22:28:38)
- 16 (2016-12-09 (金) 13:16:41)
- 17 (2017-12-05 (火) 18:36:23)
- 18 (2018-02-24 (土) 19:51:30)
- 19 (2019-08-16 (金) 14:03:07)
- 20 (2021-04-11 (日) 00:34:25)
- 21 (2025-01-03 (金) 08:57:02)
- 22 (2025-01-03 (金) 09:01:23)
- 23 (2025-01-03 (金) 09:02:38)
- 24 (2025-01-03 (金) 09:03:21)
- 25 (2025-01-03 (金) 09:04:02)
- 26 (2025-05-09 (金) 15:46:15)
- 27 (2025-06-19 (木) 12:41:37)
- 28 (2025-06-19 (木) 12:43:47)
- 追加された行はこの色です。
- 削除された行はこの色です。
TITLE:JTableのセルにHyperlinkを表示 #navi(../) RIGHT:Posted by [[terai]] at 2008-12-29 *JTableのセルにHyperlinkを表示 [#f072587c] 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: https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTOF06rk7I/AAAAAAAAAb0/31ZBya_beYk/s800/HyperlinkInTableCell.png hreflang: href: https://java-swing-tips.blogspot.com/2009/02/hyperlink-in-jtable-cell.html lang: en --- * Summary [#summary] `JTable`のセルの中に、`Hyperlink`を表示します。 -&jnlp; -&jar; -&zip; #download(https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTOF06rk7I/AAAAAAAAAb0/31ZBya_beYk/s800/HyperlinkInTableCell.png) #screenshot * Source Code Examples [#sourcecode] #code(link){{ class UriRenderer extends DefaultTableCellRenderer implements MouseListener, MouseMotionListener { private int viewRowIndex = -1; private int viewColumnIndex = -1; private boolean isRollover; **サンプルコード [#d5d8fa16] #code{{ 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()); @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 this; return c; } public void mouseMoved(MouseEvent e) { JTable table = (JTable)e.getSource(); 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(); row = table.rowAtPoint(pt); col = table.columnAtPoint(pt); if(row<0 || col<0) { row = -1; col = -1; 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; } table.repaint(); // >>>> 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(); } public void mouseExited(MouseEvent e) { JTable table = (JTable)e.getSource(); row = -1; col = -1; 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; } } public void mouseClicked(MouseEvent e) { JTable table = (JTable)e.getSource(); @Override public void mouseClicked(MouseEvent e) { JTable table = (JTable) e.getComponent(); 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(); //} 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()); } } } public void mouseDragged(MouseEvent e) {} public void mouseEntered(MouseEvent e) {} public void mousePressed(MouseEvent e) {} public void mouseReleased(MouseEvent e) {} @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 */ } } }} **解説 [#sd316cd4] htmlタグを使って文字列を修飾するセルレンダラーを作成して使用しています。 * Description [#description] 上記のサンプルでは、`JTable`のセル内にリンクを表現するために`html`タグを使って文字列を修飾するセルレンダラーを作成して使用しています。 #code{{ URLRenderer renderer = new URLRenderer(); table.setDefaultRenderer(URL.class, renderer); table.addMouseListener(renderer); table.addMouseMotionListener(renderer); }} ---- 上記のサンプルでは、クリックしてもリンク先には接続せず、System.out.println(table.getValueAt(crow, ccol));で文字列を表示しているだけです。 **参考リンク [#ofbb1d91] -[[Hyperlinkを、JLabel、JButton、JEditorPaneで表示>Swing/HyperlinkLabel]] * Reference [#reference] - [[Hyperlinkを、JLabel、JButton、JEditorPaneで表示>Swing/HyperlinkLabel]] - [[Htmlで修飾した文字列のクリップ>Swing/ClippedHtmlLabel]] **コメント [#v4971191] - URLRendererのコンストラクタでJTableにマウスリスナを追加していたのを修正。 -- [[terai]] &new{2009-06-25 (木) 12:05:13}; - 「解説」中のコードではコンストラクタにtableが渡されたままになっているようです。 -- [[yosei]] &new{2010-05-05 (Wed) 16:54:43}; -- コメントありがとうございます。ご指摘のように修正し忘れていました。 -- [[terai]] &new{2010-05-06 (木) 17:04:59}; * Comment [#comment] #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