Swing/LargeCellEditor のバックアップ(No.11)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/LargeCellEditor へ行く。
- 1 (2006-08-28 (月) 00:57:26)
- 2 (2006-08-28 (月) 08:21:34)
- 3 (2006-08-28 (月) 16:26:07)
- 4 (2006-08-31 (木) 14:27:45)
- 5 (2006-10-29 (日) 02:01:59)
- 6 (2007-04-11 (水) 16:07:24)
- 7 (2007-07-03 (火) 19:21:07)
- 8 (2012-09-05 (水) 23:15:13)
- 9 (2013-02-24 (日) 22:28:05)
- 10 (2015-01-20 (火) 15:49:33)
- 11 (2016-05-20 (金) 19:17:07)
- 12 (2016-05-27 (金) 13:14:22)
- 13 (2017-08-31 (木) 13:54:58)
- 14 (2018-09-14 (金) 20:04:37)
- 15 (2018-10-30 (火) 16:36:36)
- 16 (2018-12-21 (金) 14:09:26)
- 17 (2020-11-22 (日) 01:13:23)
- 18 (2023-01-20 (金) 17:37:28)
- title: JTableの編集にセルより大きなセルエディタを使用 tags: [JTable, JList, GlassPane] author: aterai pubdate: 2006-08-28T00:57:26+09:00 description: 通常のセルエディタではなく、セルより大きなアイコンを選択する為のセルエディタを使用してJTableを編集します。
概要
通常のセルエディタではなく、セルより大きなアイコンを選択する為のセルエディタを使用してJTable
を編集します。
Screenshot
Advertisement
サンプルコード
class IconTable extends JTable {
private final MyGlassPane panel = new MyGlassPane();
private final EditorFromList editor;
private final JFrame frame;
private Rectangle rect;
public IconTable(JFrame _frame, TableModel model, Vector list) {
super(model);
setDefaultRenderer(Object.class, new TestRenderer());
setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
initCellSize(50);
frame = _frame;
addMouseListener(new MouseAdapter() {
@Override public void mouseClicked(MouseEvent me) {
startEditing();
}
});
editor = new EditorFromList(list);
editor.addKeyListener(new KeyAdapter() {
@Override public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
cancelEditing();
}
}
});
editor.addMouseListener(new MouseAdapter() {
@Override public void mouseClicked(MouseEvent me) {
changeValue(me.getPoint());
}
});
panel.add(editor);
frame.setGlassPane(panel);
panel.setVisible(false);
}
private void initCellSize(int size) {
setRowHeight(size);
JTableHeader tableHeader = getTableHeader();
tableHeader.setResizingAllowed(false);
tableHeader.setReorderingAllowed(false);
TableColumnModel m = getColumnModel();
for (int i = 0; i < m.getColumnCount(); i++) {
TableColumn col = m.getColumn(i);
col.setMinWidth(size);
col.setMaxWidth(size);
}
setBorder(BorderFactory.createLineBorder(Color.BLACK));
}
private void initEditor() {
Dimension dim = editor.getPreferredSize();
rect = getCellRect(getSelectedRow(), getSelectedColumn(), true);
int iv = (dim.width - rect.width) / 2;
Point p = SwingUtilities.convertPoint(this,
rect.getLocation(), panel);
rect.setRect(p.x - iv, p.y - iv, dim.width, dim.height);
editor.setBounds(rect);
Object o = getValueAt(getSelectedRow(), getSelectedColumn());
editor.setSelectedValue(o, true);
}
public void startEditing() {
initEditor();
panel.setVisible(true);
editor.requestFocusInWindow();
}
private void cancelEditing() {
panel.setVisible(false);
}
private void changeValue(Point p) {
int index = editor.locationToIndex(p);
Object o = editor.getModel().getElementAt(index);
if (o != null) {
setValueAt(o, getSelectedRow(), getSelectedColumn());
}
panel.setVisible(false);
}
}
View in GitHub: Java, Kotlin解説
上記のサンプルでは、JTable
のセルをクリックするとそのセル上にセルエディタが表示されて編集できるようになっています。
通常のセルエディタは使用しないため、すべてのセルを編集不可にしています。かわりにセルをクリックしたときに、フレームのGlassPane
を有効にして、そこにJList
で作成したアイコン選択エディタや、その影などを描画しています。
このようにGlassPane
を使用しているため、フレームの外にセルエディタを描画することができません。このためサンプルではJTable
の周りに余白をかなり多めにとっています。JTable
からはみ出す場合(端の方のセルを編集する場合)は、セルエディタの表示位置を内部にずらすように変更するようにしたほうがいいかもしれません。