Swing/TableFileList のバックアップ(No.1)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - 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)
TITLE:JTableで文字列をクリックした場合だけセルを選択状態にする
Posted by terai at 2006-12-25
JTableで文字列をクリックした場合だけセルを選択状態にする
JTableの文字列以外の場所がクリックされた場合、そのセルが選択されないようにします。
- &jnlp;
- &jar;
- &zip;
#screenshot
サンプルコード
private static final int ICON_SIZE = 16;
private static Rectangle getCellRect2(JTable table, Point pt, int row, int col) {
FontMetrics fm = table.getFontMetrics(table.getFont());
Object o = table.getValueAt(row, col);
int w = fm.stringWidth(o.toString()) + ICON_SIZE + 2 + 2;
Rectangle rect = table.getCellRect(row, col, true);
rect.setSize(w, rect.height);
return rect;
}
class TestRenderer extends Box implements TableCellRenderer {
private final MyLabel textLabel;
private final JLabel iconLabel = new JLabel();
public int getStringWidth(int row, int column) {
FontMetrics fm = table.getFontMetrics(table.getFont());
Object o = table.getValueAt(row, column);
return fm.stringWidth(o.toString())
+ iconLabel.getPreferredSize().width
+ textLabel.getInsets().left
+ textLabel.getInsets().right;
}
//......
解説
上記のサンプルでは、Nameカラムのセル中にあるアイコンと文字列の上でクリックされた場合のみ、そのセルが選択されるようになっています。
JTable#columnAtPoint(Point)メソッドをオーバーライドし MouseAdapterMouseInputAdapterを設定し、Nameカラムのセルの文字列上でクリックされたかどうかを判別クリックされたポイントがそのセルの文字列上に無い場合、別のセル(幅0のダミーカラム)がクリックされたように偽装し、現在の選択状態を解除- JTable.putClientProperty("Table.isFileList", Boolean.TRUE) で、0列目の文字列以外がクリックされても選択されないように変更
- Windows LnF のみ?
- 範囲選択の場合は、文字列の幅を自前で計算
参考リンク
コメント
- JTable#columnAtPoint(Point)メソッドをオーバーライドする方法では、CPUが100%になってしまうので、クリック、ドラッグした場合だけ、評価するように修正しました。 -- terai
- JTable#getToolTipText(MouseEvent)メソッドをオーバーライドして、Nameカラムのセルの余白では、ツールチップも表示しないように変更しました。 -- terai
- table.putClientProperty("Table.isFileList", Boolean.TRUE); を使えば、MouseListenerなどもすべて必要なさそう…。 -- terai
- putClientProperty("Table.isFileList", Boolean.TRUE) を使用するように変更、JListのアイテムを範囲指定で選択での範囲選択機能を追加。 -- terai