JTable là một lớp con của JComponent dùng để tạo bảng hiển thị thông tin theo nhiều hàng và cột. Khi giá trị được chọn từ JTable, một TableModelEvent được sinh ra, được xử lý bằng cách triển khai TableModelListener. Chúng ta có thể thêm hoặc chèn JButton vào ô JTable bằng cách tùy chỉnh code trong DefaultTableModel hoặc AbstractTableModel và cũng có thể tùy chỉnh bằng cách triển khai giao diện TableCellRenderer và ghi đè phương thức getTableCellRendererComponent().
Ví dụ
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
public class JTableButtonTest extends JFrame {
private JTable table;
private JScrollPane scrollPane;
public JTableButtonTest() {
setTitle("JTableButton Test");
TableCellRenderer tableRenderer;
table = new JTable(new JTableButtonModel());
tableRenderer = table.getDefaultRenderer(JButton.class);
table.setDefaultRenderer(JButton.class, new JTableButtonRenderer(tableRenderer));
scrollPane = new JScrollPane(table);
add(scrollPane, BorderLayout.CENTER);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setSize(400, 300);
setVisible(true);
}
public static void main(String[] args) {
new JTableButtonTest();
}
}
class JTableButtonRenderer implements TableCellRenderer {
private TableCellRenderer defaultRenderer;
public JTableButtonRenderer(TableCellRenderer renderer) {
defaultRenderer = renderer;
}
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column) {
if (value instanceof Component)
return (Component) value;
return defaultRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
}
}
class JTableButtonModel extends AbstractTableModel {
private Object[][] rows = {{"Button1", new JButton("Button1")}, {"Button2", new JButton("Button2")},
{"Button3", new JButton("Button3")}, {"Button4", new JButton("Button4")}};
private String[] columns = {"Count", "Buttons"};
public String getColumnName(int column) {
return columns[column];
}
public int getRowCount() {
return rows.length;
}
public int getColumnCount() {
return columns.length;
}
public Object getValueAt(int row, int column) {
return rows[row][column];
}
public boolean isCellEditable(int row, int column) {
return false;
}
public Class getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
}
Kết quả
