Swing/DeleteButtonInCell のバックアップ差分(No.19)
- バックアップ一覧
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- バックアップ を表示
- Swing/DeleteButtonInCell へ行く。
- 1 (2007-10-22 (月) 07:55:05)
- 2 (2007-10-22 (月) 13:45:08)
- 3 (2007-10-22 (月) 18:25:09)
- 4 (2007-10-23 (火) 15:25:45)
- 5 (2007-10-24 (水) 18:07:28)
- 6 (2007-11-19 (月) 20:27:32)
- 7 (2008-03-28 (金) 16:57:54)
- 8 (2008-05-08 (木) 18:30:17)
- 9 (2009-09-27 (日) 01:34:58)
- 10 (2009-10-05 (月) 12:53:57)
- 11 (2009-10-19 (月) 19:27:12)
- 12 (2011-03-11 (金) 02:58:45)
- 13 (2013-01-30 (水) 23:45:53)
- 14 (2013-08-02 (金) 20:54:19)
- 15 (2013-08-06 (火) 13:23:42)
- 16 (2013-09-11 (水) 00:38:54)
- 17 (2014-03-27 (木) 18:00:27)
- 18 (2014-06-26 (木) 16:19:29)
- 19 (2014-11-01 (土) 00:20:00)
- 20 (2014-11-25 (火) 03:03:31)
- 21 (2015-11-29 (日) 23:59:49)
- 22 (2016-05-26 (木) 14:41:20)
- 23 (2016-06-01 (水) 20:51:57)
- 24 (2017-03-08 (水) 13:04:23)
- 25 (2017-11-02 (木) 15:34:40)
- 26 (2018-01-09 (火) 17:29:17)
- 27 (2019-05-22 (水) 19:34:28)
- 28 (2020-01-02 (木) 19:29:39)
- 29 (2021-07-03 (土) 03:41:03)
- 30 (2022-08-20 (土) 22:15:25)
- 31 (2024-02-02 (金) 12:05:06)
- 追加された行はこの色です。
- 削除された行はこの色です。
TITLE:JTableのセルにJButtonを追加して行削除 #navi(../) #tags(JTable, JButton, TableCellRenderer, TableCellEditor, ActionListener) RIGHT:Posted by &author(aterai); at 2007-10-22 * JTableのセルにJButtonを追加して行削除 [#y5a20522] --- title: JTableのセルにJButtonを追加して行削除 tags: [JTable, JButton, TableCellRenderer, TableCellEditor, ActionListener] author: aterai pubdate: 2007-10-22T07:55:05+09:00 description: JTableのセルにJButtonを追加し、クリックされたらその行を削除します。 --- * 概要 [#y5a20522] `JTable`のセルに`JButton`を追加し、クリックされたらその行を削除します。 #download #ref(https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTKsRqqqeI/AAAAAAAAAWY/X0y-Ph7jngA/s800/DeleteButtonInCell.png) #download(https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTKsRqqqeI/AAAAAAAAAWY/X0y-Ph7jngA/s800/DeleteButtonInCell.png) ** サンプルコード [#i9dca28f] * サンプルコード [#i9dca28f] #code(link){{ class DeleteButton extends JButton { @Override public void updateUI() { super.updateUI(); setBorder(BorderFactory.createEmptyBorder()); setFocusable(false); setRolloverEnabled(false); setText("X"); } } class DeleteButtonRenderer extends DeleteButton implements TableCellRenderer { public DeleteButtonRenderer() { super(); setName("Table.cellRenderer"); } @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { return this; } } class DeleteButtonEditor extends DeleteButton implements TableCellEditor { public DeleteButtonEditor(final JTable table) { super(); addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { int row = table.convertRowIndexToModel(table.getEditingRow()); fireEditingStopped(); ((DefaultTableModel)table.getModel()).removeRow(row); } }); } @Override public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { return this; } @Override public Object getCellEditorValue() { return ""; } //Copid from AbstractCellEditor //Copied from AbstractCellEditor //protected EventListenerList listenerList = new EventListenerList(); //transient protected ChangeEvent changeEvent = null; //...... }} ** 解説 [#qcbd9c4d] * 解説 [#qcbd9c4d] %%上記のサンプルでは、ボタンがクリックされたときの削除自体は、`JTable`に追加したマウスリスナーで行っており、セルエディタやセルレンダラーに使っている`JButton`は表示のためのダミーです。%% - セルレンダラーに使っている`JButton`は表示のためのダミー - セルエディタとして使用する`JButton`に`ActionListener`を追加し、クリックされたら`AbstractCellEditor`からコピーした`fireEditingStopped()`メソッドで編集を終了し、`TableModel`から行を削除 -- セルレンダラ、セルエディタがコンポーネント(もしくは`DefaultCellEditor`)を継承していないと、`JTable`の`LookAndFeel`を変更てもセルレンダラ、セルエディタの`updateUI()`が呼ばれない --- `JTable#updateUI()`、`Java 1.6.0`の`JTable#updateSubComponentUI(...)`、`Java 1.7.0`の`SwingUtilities#updateRendererOrEditorUI(Object)`を参照 -- `AbstractCellEditor`を継承していても`updateUI()`は呼ばれない、`DefaultCellEditor`は継承しづらい… ** 参考リンク [#kcf3a9d4] * 参考リンク [#kcf3a9d4] - [https://forums.oracle.com/thread/1357728 Swing - JButton inside JTable Cell] - [[JTableの行を追加、削除>Swing/AddRow]] - [[JTableの行を全削除>Swing/ClearTable]] - [[JTableのセルに複数のJButtonを配置する>Swing/MultipleButtonsInTableCell]] - [[JTableのセルにHyperlinkを表示>Swing/HyperlinkInTableCell]] ** コメント [#t2516d67] - ボタンのセル内でマウスを移動しても削除するように変更。 -- [[aterai]] &new{2008-03-28 (金) 16:59:11}; -- メモ: `0`行目のボタンをクリックし、真上のヘッダ上でリリースしても削除できる -> [http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6291631 Bug ID: 6291631 JTable: rowAtPoint returns 0 for negative y] (追記: このバグは未修正になっているけど、`JDK 1.6, 1.7`などのソースではコメントにある修正が追加されている) -- [[aterai]] &new{2008-03-28 (金) 17:21:10}; * コメント [#t2516d67] #comment - ボタンのセル内でマウスを移動しても削除するように変更。 -- &user(aterai); &new{2008-03-28 (金) 16:59:11}; -- メモ: `0`行目のボタンをクリックし、真上のヘッダ上でリリースしても削除できる -> [http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6291631 Bug ID: 6291631 JTable: rowAtPoint returns 0 for negative y] (追記: このバグは未修正になっているけど、`JDK 1.6, 1.7`などのソースではコメントにある修正が追加されている) -- &user(aterai); &new{2008-03-28 (金) 17:21:10}; #code{{ //上記のBug Databaseにある回避方法 JTable table = new JTable(model) { @Override public int rowAtPoint(Point pt) { return (pt.y<0)?-1:super.rowAtPoint(pt); } }; }} - テスト -- [[aterai]] &new{2009-09-27 (日) 01:34:58}; - テスト -- &user(aterai); &new{2009-09-27 (日) 01:34:58}; -- [[JTableのセルに複数のJButtonを配置する>Swing/MultipleButtonsInTableCell]]に移動。 #comment