JTableにJButtonを配置
ボタンに限らず、JTable上にコントロールを配置するのって、もっと簡単にできてよさそうな気がするんですけどね。
上記サイトでは、Java6の機能(JTable#convertRowIndexToModel()など)を使用していますので、Java1.4で動くバージョンを書いてみました。但し、最低限のコードです。細かいところはおかしな動きになるかも知れませんので、あしからず。
class ButtonCellRenderer extends AbstractCellEditor implements TableCellRenderer, TableCellEditor { private final JButton button; public ButtonCellRenderer(final JTable table, final DefaultTableModel model) { this.button = new JButton("Delete"); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { fireEditingStopped(); // これが重要 } }); table.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { Point point = e.getPoint(); if (table.columnAtPoint(point) == 0) { fireEditingStopped(); int row = table.rowAtPoint(point); if (row >= 0) { model.removeRow(row); } } } }); } public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { return button; } public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { return button; } public Object getCellEditorValue() { return button.getText(); } } class JButtonInJTableSample { private static void show() { String[] names = {"", "shape", "color"}; Object[][] data = {{"", "sphere", "blue"}, {"", "cone", "red"}}; DefaultTableModel model = new DefaultTableModel(data, names); JTable table = new JTable(model); ButtonCellRenderer renderer = new ButtonCellRenderer(table, model); TableColumn column0 = table.getColumnModel().getColumn(0); column0.setCellEditor(renderer); column0.setCellRenderer(renderer); JFrame frame = new JFrame(); frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); frame.getContentPane().add(table); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { show(); } }); } }