JTable 为单元格添加按钮效果和事件效果
时间: 2024-03-05 20:54:10 浏览: 13
要为 JTable 中的单元格添加按钮效果和事件效果,可以通过自定义 TableCellRenderer 和 TableCellEditor 来实现。以下是一个示例代码:
```java
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.AbstractCellEditor;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
public class JTableButtonDemo extends JFrame {
private JTable table;
public JTableButtonDemo() {
super("JTable Button Demo");
DefaultTableModel model = new DefaultTableModel(new Object[][] { { "1", "Button 1" },
{ "2", "Button 2" }, { "3", "Button 3" }, { "4", "Button 4" } },
new Object[] { "ID", "Button" });
table = new JTable(model);
table.getColumn("Button").setCellRenderer(new ButtonRenderer());
table.getColumn("Button").setCellEditor(new ButtonEditor());
JScrollPane scrollPane = new JScrollPane(table);
JPanel panel = new JPanel();
panel.add(scrollPane);
this.setContentPane(panel);
this.pack();
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
private class ButtonRenderer extends JButton implements TableCellRenderer {
public ButtonRenderer() {
setOpaque(true);
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
setText((value == null) ? "" : value.toString());
return this;
}
}
private class ButtonEditor extends AbstractCellEditor implements TableCellEditor, ActionListener {
private JButton button;
private Object value;
public ButtonEditor() {
button = new JButton();
button.addActionListener(this);
}
@Override
public Object getCellEditorValue() {
return value;
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row,
int column) {
this.value = value;
button.setText((value == null) ? "" : value.toString());
return button;
}
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(button, "Button " + value + " is clicked!");
fireEditingStopped();
}
}
public static void main(String[] args) {
new JTableButtonDemo();
}
}
```
在以上示例代码中,我们通过实现 TableCellRenderer 接口和 TableCellEditor 接口,分别为 JTable 中的单元格添加了按钮渲染效果和按钮编辑效果,同时为按钮添加了点击事件。具体实现细节可以参考代码注释。