Swing/CheckBoxesInTableCell のバックアップ(No.32)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/CheckBoxesInTableCell へ行く。
- 1 (2011-03-01 (火) 14:22:06)
- 2 (2011-03-01 (火) 21:12:24)
- 3 (2011-03-03 (木) 13:12:32)
- 4 (2011-03-04 (金) 15:57:16)
- 5 (2011-03-09 (水) 22:25:10)
- 6 (2011-03-10 (木) 16:15:06)
- 7 (2011-03-10 (木) 19:01:22)
- 8 (2011-03-15 (火) 16:12:51)
- 9 (2011-03-15 (火) 19:21:35)
- 10 (2011-11-01 (火) 18:12:50)
- 11 (2011-11-10 (木) 18:49:57)
- 12 (2012-05-21 (月) 14:14:17)
- 13 (2012-12-23 (日) 05:46:28)
- 14 (2013-04-06 (土) 05:23:26)
- 15 (2013-07-27 (土) 01:06:49)
- 16 (2013-08-17 (土) 01:14:38)
- 17 (2013-10-10 (木) 11:39:38)
- 18 (2014-06-26 (木) 16:17:59)
- 19 (2014-10-07 (火) 17:45:51)
- 20 (2014-11-21 (金) 18:28:54)
- 21 (2015-03-06 (金) 19:02:50)
- 22 (2015-03-25 (水) 17:01:50)
- 23 (2015-04-02 (木) 15:10:13)
- 24 (2016-01-12 (火) 17:53:22)
- 25 (2017-06-20 (火) 13:51:57)
- 26 (2017-08-07 (月) 19:48:14)
- 27 (2018-02-24 (土) 19:51:30)
- 28 (2018-08-09 (木) 18:19:41)
- 29 (2019-02-20 (水) 15:32:34)
- 30 (2019-05-22 (水) 19:34:28)
- 31 (2020-12-06 (日) 00:14:12)
- 32 (2023-03-16 (木) 15:44:30)
- category: swing
folder: CheckBoxesInTableCell
title: JTableのCellにJCheckBoxを複数配置する
tags: [JTable, JCheckBox, TableCellRenderer, TableCellEditor, JPanel, InputMap, ActionMap]
author: aterai
pubdate: 2011-02-28T15:07:56+09:00
description: JTableのセル中にJCheckBoxを複数個配置します。
image:
hreflang:
href: https://java-swing-tips.blogspot.com/2011/03/checkboxes-in-jtable-cell.html lang: en
概要
JTable
のセル中にJCheckBox
を複数個配置します。
Screenshot
Advertisement
サンプルコード
class CheckBoxesPanel extends JPanel {
private static final String OSNAME = System.getProperty("os.name");
protected final String[] title = {"r", "w", "x"};
public JCheckBox[] buttons;
public CheckBoxesPanel() {
super();
setOpaque(false);
setBackground(new Color(0x0, true));
setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
initButtons();
}
protected void initButtons() {
buttons = new JCheckBox[title.length];
for (int i = 0; i < buttons.length; i++) {
JCheckBox b = new JCheckBox(title[i]);
b.setOpaque(false);
b.setFocusable(false);
b.setRolloverEnabled(false);
b.setBackground(new Color(0x0, true));
buttons[i] = b;
add(b);
add(Box.createHorizontalStrut(5));
}
}
protected void updateButtons(Object v) {
if ("Windows 7".equals(OSNAME)) { //Windows aero?
removeAll();
initButtons();
}
Integer i = (Integer) (v == null ? 0 : v);
buttons[0].setSelected((i & (1 << 2)) != 0);
buttons[1].setSelected((i & (1 << 1)) != 0);
buttons[2].setSelected((i & (1 << 0)) != 0);
}
}
class CheckBoxesRenderer extends CheckBoxesPanel
implements TableCellRenderer, Serializable {
public CheckBoxesRenderer() {
super();
setName("Table.cellRenderer");
}
@Override public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row, int column) {
updateButtons(value);
return this;
}
public static class UIResource extends CheckBoxesRenderer implements UIResource {}
}
class CheckBoxesEditor extends CheckBoxesPanel
implements TableCellEditor, Serializable {
public CheckBoxesEditor() {
ActionListener al = new ActionListener() {
@Override public void actionPerformed(ActionEvent e) {
fireEditingStopped();
}
};
ActionMap am = getActionMap();
for (int i = 0; i < buttons.length; i++) {
final JCheckBox b = buttons[i];
b.addActionListener(al);
am.put(title[i], new AbstractAction(title[i]) {
@Override public void actionPerformed(ActionEvent e) {
b.setSelected(!b.isSelected());
fireEditingStopped();
}
});
}
InputMap im = getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_R, 0), title[0]);
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_W, 0), title[1]);
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_X, 0), title[2]);
}
@Override public Component getTableCellEditorComponent(JTable table,
Object value, boolean isSelected, int row, int column) {
updateButtons(value);
return this;
}
@Override public Object getCellEditorValue() {
int i = 0;
if (buttons[0].isSelected()) i |= 1 << 2;
if (buttons[1].isSelected()) i |= 1 << 1;
if (buttons[2].isSelected()) i |= 1 << 0;
return i;
}
// Copied from AbstractCellEditor
protected EventListenerList listenerList = new EventListenerList();
transient protected ChangeEvent changeEvent = null;
// ...
View in GitHub: Java, Kotlin解説
JTable
のセル内に3
つのJCheckBox
を配置したJPanel
を作成- この
JPanel
をCellRenderer
用とCellEditor
用として別々に使用
- この
JCheckBox
をマウスでクリックすると直下にあるJCheckBox
の選択状態のみ更新- 編集中にカラムヘッダの移動、リサイズ(
JFrame
などのリサイズに連動)などが発生してもチェックした内容がリセットされないようにCellEditor
のチェックボックスがクリックされたらfireEditingStopped()
メソッドを呼び出して編集を終了し更新を確定する