Java Swing JTable: I want to implement a nested table, and I have overwritten the getCellRenderer(int,int) function to implement this nested table, but I don't know how to add mouseListener to the small nested table in my big table. In fact I have added the listener, but it did not work, I don't know why. The code is shown below. Thank you!
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.*;
import javax.swing.table.*;
public class SubTableTest extends JTable {
public SubTableTest() {
JFrame f = new JFrame("测试窗口");
f.setVisible(true);
f.pack();
Object[][] p = { { "王鹏", "91", "100", "191" }, { "朱雪莲", "82", "100", "182" },
{ "梅庭", "47", "100", "147" }, { "赵龙", "61", "100", "161" }, { "李兵", "90", "100", "190" }};
String[] n = { "姓名", "语文", "数学", "总分" };
JScrollPane scroPanel = new JScrollPane(this);
f.getContentPane().add(scroPanel, BorderLayout.CENTER);
f.setSize(800, 500);
setModel(new DefaultTableModel(p, n));
setRowHeight(1, super.getRowHeight() * 4);
}
MouseListener mouseListener = new MouseListener() {
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("subtable has been clicked !!!");
}
};
public TableCellRenderer getCellRenderer(int row, int column) {
if (row == 1 && column == 2) {
return new TableCellRenderer() {
DefaultTableModel dtm = new DefaultTableModel(4, 4);
{
dtm.setValueAt(111, 0, 0);
dtm.setValueAt(222, 0, 1);
dtm.setValueAt(333, 1, 0);
dtm.setValueAt(444, 1, 1);
}
JTable subTable = new JTable(dtm);
{
subTable.addMouseListener(mouseListener);
}
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
return subTable;
}
};
}
else {
return super.getCellRenderer(row, column); // 如果是其他地方的表格,沿用父类中提供的渲染器
}
}
public static void main(String[] args) {
new SubTableTest();
}
}