Swing/MultipleButtonsInTableCell のバックアップ(No.2)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/MultipleButtonsInTableCell へ行く。
- 1 (2009-10-06 (火) 11:55:06)
- 2 (2009-10-19 (月) 19:26:55)
- 3 (2009-11-03 (火) 04:36:55)
- 4 (2009-11-03 (火) 05:57:35)
- 5 (2011-03-04 (金) 15:57:52)
- 6 (2011-03-05 (土) 01:15:35)
- 7 (2011-03-10 (木) 02:33:21)
- 8 (2011-03-11 (金) 00:37:21)
- 9 (2011-05-06 (金) 18:49:11)
- 10 (2012-02-07 (火) 18:09:44)
- 11 (2012-09-28 (金) 19:36:52)
- 12 (2013-01-05 (土) 19:50:02)
- 13 (2013-05-24 (金) 11:57:26)
- 14 (2013-05-24 (金) 23:59:16)
- 15 (2013-07-21 (日) 02:37:44)
- 16 (2013-07-26 (金) 01:15:37)
- 17 (2013-08-17 (土) 01:12:15)
- 18 (2013-08-17 (土) 02:15:47)
- 19 (2014-05-15 (木) 18:18:57)
- 20 (2014-06-26 (木) 16:20:28)
- 21 (2014-11-07 (金) 03:09:24)
- 22 (2014-11-17 (月) 00:00:10)
- 23 (2014-11-21 (金) 18:29:32)
- 24 (2015-12-27 (日) 23:09:36)
- 25 (2017-06-15 (木) 15:23:24)
- 26 (2017-11-02 (木) 15:32:16)
- 27 (2018-02-24 (土) 19:51:30)
- 28 (2018-06-13 (水) 18:44:19)
- 29 (2020-06-07 (日) 15:57:34)
- 30 (2021-11-21 (日) 22:03:09)
- 31 (2023-05-20 (土) 01:55:25)
TITLE:JTableのセルに複数のJButtonを配置する
Posted by terai at 2009-10-05
JTableのセルに複数のJButtonを配置する
JTableのセル内にクリック可能な複数のJButtonを配置します。
- &jnlp;
- &jar;
- &zip;
#screenshot
サンプルコード
class ButtonsEditorRenderer extends AbstractCellEditor
implements TableCellRenderer,TableCellEditor{
private final JPanel renderer = new JPanel();
private final JPanel editor = new JPanel();
public ButtonsEditorRenderer(final JTable table) {
super();
JButton viewButton2 = new JButton(new AbstractAction("view2") {;
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(table, "Viewing");
}
});
JButton editButton2 = new JButton(new AbstractAction("edit2") {;
@Override
public void actionPerformed(ActionEvent e) {
//int row = table.convertRowIndexToModel(table.getSelectedRow());
int row = table.getSelectedRow();
Object o = table.getModel().getValueAt(row, 0);
JOptionPane.showMessageDialog(table, "Editing: "+o);
}
});
renderer.setOpaque(true);
renderer.add(new JButton("view1"));
renderer.add(new JButton("edit1"));
editor.setOpaque(true);
editor.add(viewButton2);
editor.add(editButton2);
}
@Override
public Component getTableCellRendererComponent(
JTable table, Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
renderer.setBackground(isSelected?table.getSelectionBackground()
:table.getBackground());
return renderer;
}
@Override
public Component getTableCellEditorComponent(
JTable table, Object value, boolean isSelected, int row, int column) {
editor.setBackground(table.getSelectionBackground());
return editor;
}
@Override
public Object getCellEditorValue() {
return "";
}
}
解説
上記のサンプルでは、CellRenderer用とCellEditor用に、JButtonを2つ配置したJPanelをそれぞれ作成しています。アクションイベントを設定するのは、CellEditor用のJButtonで、CellRenderer用のJButtonは表示のためのダミーです。
行の選択状態が切り替わるとき(例えば、一行目を選択していて、二行目のボタンをクリック)には、CellEditor用のJButtonがうまくクリックできないので、JTable自体に以下のようなマウスリスナーを設定しています。
class CellButtonsMouseListener extends MouseAdapter{
private Component component = null;
private boolean isOnButtonColumn(MouseEvent e) {
JTable t = (JTable)e.getComponent();
Point pt = e.getPoint();
int mcol = t.convertColumnIndexToModel(t.columnAtPoint(pt));
int vrow = t.rowAtPoint(pt);
int mrow = (vrow>=0)?t.convertRowIndexToModel(vrow):-1;
return mrow>=0 && mcol==1;
}
private Component getCellComponentAt(MouseEvent e) {
JTable t = (JTable)e.getComponent();
Point p = e.getPoint();
int row = t.rowAtPoint(p);
int col = t.columnAtPoint(p);
TableCellEditor ce = t.getCellEditor(row,col);
Component c = ce.getTableCellEditorComponent(t,null,true,row,col);
Point pt = SwingUtilities.convertPoint(t, p, c);
return SwingUtilities.getDeepestComponentAt(c, pt.x, pt.y);
}
@Override
public void mousePressed(MouseEvent e) {
if(isOnButtonColumn(e)) {
EventQueue.invokeLater(new Runnable() {
public void run() {
JTable t = (JTable)e.getComponent();
Point pt = e.getPoint();
component = getCellComponentAt(e);
component.requestFocusInWindow();
t.editCellAt(t.rowAtPoint(pt), t.columnAtPoint(pt));
}
});
}
}
@Override
public void mouseReleased(MouseEvent e) {
if(isOnButtonColumn(e)) {
Component c = getCellComponentAt(e);
if(c instanceof JButton && c==component) ((JButton)c).doClick();
component = null;
}
}
}
参考リンク
コメント
- 第0列目が編集状態でボタンをクリックした場合、パネルが二度表示されるバグを修正。 -- terai