Swing/DisabledHeader のバックアップ(No.14)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/DisabledHeader へ行く。
- 1 (2005-09-11 (日) 15:59:47)
- 2 (2006-02-27 (月) 15:47:07)
- 3 (2006-04-12 (水) 19:40:39)
- 4 (2006-10-18 (水) 17:59:48)
- 5 (2006-11-10 (金) 13:51:09)
- 6 (2007-04-18 (水) 12:36:05)
- 7 (2007-05-25 (金) 14:39:24)
- 8 (2008-06-11 (水) 17:01:30)
- 9 (2011-12-16 (金) 15:06:54)
- 10 (2012-08-09 (木) 23:54:42)
- 11 (2013-03-27 (水) 16:50:15)
- 12 (2015-01-08 (木) 14:03:52)
- 13 (2015-03-25 (水) 16:56:03)
- 14 (2016-01-12 (火) 17:55:39)
- 15 (2016-06-02 (木) 12:26:55)
- 16 (2016-09-24 (土) 04:22:14)
- 17 (2017-10-27 (金) 13:36:10)
- 18 (2019-04-17 (水) 18:52:49)
- 19 (2021-01-28 (木) 02:15:58)
- 20 (2024-01-09 (火) 07:40:40)
- title: JTableHeaderのカラムを選択不可にする tags: [JTable, JTableHeader, TableSorter] author: aterai pubdate: 2005-07-11 description: JTableHeaderのカラムを選択不可にして、ソートなどを禁止します。
概要
JTableHeader
のカラムを選択不可にして、ソートなどを禁止します。
Screenshot
![Swing/DisabledHeader screenshot](https://ateraimemo.com/swing/disabledheader/screenshot.png)
Advertisement
サンプルコード
public class SortButtonRenderer extends JButton implements TableCellRenderer {
@Override public Component getTableCellRendererComponent(
JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column) {
JButton button = this;
if (!isEnabledAt(column)) {
button.setText((value == null) ? "" : value.toString());
button.getModel().setEnabled(false);
return button;
}
//......
private final HashMap dmap = new HashMap();
public boolean isEnabledAt(int col) {
Integer oi = Integer.valueOf(col);
if (dmap.containsKey(oi)) {
Boolean b = (Boolean) dmap.get(oi);
return b.booleanValue();
} else {
return true;
}
}
View in GitHub: Java, Kotlin解説
サンプルでは、0
列目のヘッダカラムを常に選択不可に、3
列目はチェックボックスで選択できるかどうかを切り替えるようにしています。
HashMap
に選択不可にするカラムヘッダを設定し、レンダラーがヘッダを描画するときにそれをsetEnabled(false)
しています。
TableSorter.java
を使用してソートしている場合は、TableSorter
のインナークラスのMouseHandler
を、例えば以下のように変更すると、任意のカラムをクリックしてもソートされなくなります。
private class MouseHandler extends MouseAdapter {
@Override public void mouseClicked(MouseEvent e) {
JTableHeader h = (JTableHeader) e.getSource();
TableColumnModel columnModel = h.getColumnModel();
int viewColumn = columnModel.getColumnIndexAtX(e.getX());
int column = columnModel.getColumn(viewColumn).getModelIndex();
// ここをちょっと変更
if (isSortableIndex(column)) { //column != -1 ) {
int status = getSortingStatus(column);
if (!e.isControlDown()) {
cancelSorting();
}
status = status + (e.isShiftDown() ? -1 : 1);
status = (status + 4) % 3 - 1; // signed mod, returning {-1, 0, 1}
setSortingStatus(column, status);
}
}
}
JDK 1.6.0
で導入された、TableRowSorter
を使っている場合は、ソート不可にするカラムをDefaultRowSorter#setSortable(int, boolean)
で指定し、表示を以下のようなレンダラーで切り替えます(参考:TableRowSorterでJTableのソート)。
final JTableHeader hd = table.getTableHeader();
final TableCellRenderer headerRenderer = hd.getDefaultRenderer();
hd.setDefaultRenderer(new TableCellRenderer() {
@Override public Component getTableCellRendererComponent(JTable tbl, Object val,
boolean isS, boolean hasF, int row, int col) {
JLabel lbl = (JLabel) headerRenderer.getTableCellRendererComponent(
tbl, val, isS, hasF, row, col);
int modelColumnIndex = tbl.convertColumnIndexToModel(col);
lbl.setForeground(sorter.isSortable(modelColumnIndex) ? Color.BLACK : Color.GRAY);
return lbl;
}
});