Swing/TableFileList のバックアップ差分(No.7)
- バックアップ一覧
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- バックアップ を表示
- Swing/TableFileList へ行く。
- 1 (2010-01-12 (火) 09:52:02)
- 2 (2010-08-25 (水) 18:41:45)
- 3 (2013-07-26 (金) 01:23:33)
- 4 (2013-08-17 (土) 00:25:22)
- 5 (2014-12-02 (火) 01:43:09)
- 6 (2016-02-23 (火) 14:17:33)
- 7 (2016-09-16 (金) 17:02:25)
- 8 (2017-10-29 (日) 13:46:02)
- 9 (2018-02-24 (土) 19:51:30)
- 10 (2019-05-04 (土) 21:39:58)
- 11 (2021-02-04 (木) 01:45:08)
- 12 (2024-03-30 (土) 23:35:00)
- 追加された行はこの色です。
- 削除された行はこの色です。
--- category: swing folder: TableFileList title: JTableで文字列をクリックした場合だけセルを選択状態にする tags: [JTable, TableCellRenderer] author: aterai pubdate: 2006-12-25 description: JTableの文字列以外の場所がクリックされた場合、そのセルが選択されないようにします。 image: https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTUdT6R-SI/AAAAAAAAAmE/AYebcaiE77Y/s800/TableFileList.png hreflang: href: http://java-swing-tips.blogspot.com/2010/01/make-explorer-like-jtable-file-list.html lang: en --- * 概要 [#pd0f30f5] * 概要 [#summary] `JTable`の文字列以外の場所がクリックされた場合、そのセルが選択されないようにします。 #download(https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTUdT6R-SI/AAAAAAAAAmE/AYebcaiE77Y/s800/TableFileList.png) * サンプルコード [#o4125fda] * サンプルコード [#sourcecode] #code(link){{ //SwingUtilities2.pointOutsidePrefSize(...) private static Rectangle getCellRect2(JTable table, int row, int col) { TableCellRenderer tcr = table.getCellRenderer(row, col); Object value = table.getValueAt(row, col); Component cell = tcr.getTableCellRendererComponent(table, value, false, false, row, col); Dimension itemSize = cell.getPreferredSize(); Rectangle cellBounds = table.getCellRect(row, col, false); cellBounds.width = itemSize.width; return cellBounds; // FontMetrics fm = table.getFontMetrics(table.getFont()); // Object o = table.getValueAt(row, col); // int w = fm.stringWidth(o.toString()) + 16 + 2 + 2; // Rectangle rect = table.getCellRect(row, col, true); // rect.setSize(w, rect.height); // return rect; } }} * 解説 [#hb039983] * 解説 [#explanation] 上記のサンプルでは、`Name`カラムのセル中にあるアイコンと文字列の上でクリックされた場合のみ、そのセルが選択されるようになっています。 - %%`JTable#columnAtPoint(Point)`メソッドをオーバーライドし `MouseAdapter`を設定し、`Name`カラムのセルの文字列上でクリックされたかどうかを判別%% - %%クリックされたポイントがそのセルの文字列上に無い場合、別のセル(幅`0`のダミーカラム)がクリックされたように偽装し、現在の選択状態を解除%% //- %%`JTable#columnAtPoint(Point)`メソッドをオーバーライドし `MouseAdapter`を設定し、`Name`カラムのセルの文字列上でクリックされたかどうかを判別%% //- %%クリックされたポイントがそのセルの文字列上に無い場合、別のセル(幅`0`のダミーカラム)がクリックされたように偽装し、現在の選択状態を解除%% - `JTable.putClientProperty("Table.isFileList", Boolean.TRUE)`で、`0`列目の文字列以外がクリックされても選択されないように変更 -- `WindowsLookAndFeel`のみ? - %%範囲選択の場合は、文字列の幅を自前で計算%% //- %%範囲選択の場合は、文字列の幅を自前で計算%% * 参考リンク [#s19c43e1] * 参考リンク [#reference] - [[JTableのセルをエクスプローラ風に表示する>Swing/ExplorerLikeTable]] * コメント [#sf7f8963] * コメント [#comment] #comment - `JTable#columnAtPoint(Point)`メソッドをオーバーライドする方法では、`CPU`が`100%`になってしまうので、クリック、ドラッグした場合だけ、評価するように修正しました。 -- &user(aterai); &new{2007-04-16 (月) 18:46:39}; - `JTable#getToolTipText(MouseEvent)`メソッドをオーバーライドして、`Name`カラムのセルの余白では、ツールチップも表示しないように変更しました。 -- &user(aterai); &new{2007-04-16 (月) 18:49:02}; - `table.putClientProperty("Table.isFileList", Boolean.TRUE);`を使えば、`MouseListener`などもすべて必要なさそう…。 -- &user(aterai); &new{2010-01-01 (金) 02:02:50}; -- `putClientProperty("Table.isFileList", Boolean.TRUE)`を使用するように変更、[[JListのアイテムを範囲指定で選択>Swing/RubberBanding]]での範囲選択機能を追加。 -- &user(aterai); &new{2010-01-05 (火) 16:07:48}; - KBD{Ctrl+A}などの`JTable#selectAll()`で、`Comment`カラムが選択できるのを修正。 -- &user(aterai); &new{2010-08-25 (水) 18:41:45}; #comment