0

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();
        }
    }
Chuyang
  • 71
  • 1
  • 7
  • 3
    You'll need a `TableCellEditor`; alternatively, display the nested table in an adjacent component in response to a `ListSelectionListener`. – trashgod Jul 27 '15 at 15:55
  • 1
    *"..in order to implement nested table.."* Another 'unusable GUI' in the making.. I would recommend the 2nd option of @trashgod instead - 'adjacent component'. – Andrew Thompson Jul 27 '15 at 16:28
  • @trashgod Thank you ! Though I don't really understand now, I will hava a try. – Chuyang Jul 27 '15 at 16:29
  • @Chuyang: A related example is cited [here](http://stackoverflow.com/a/30417875/230513). – trashgod Jul 27 '15 at 17:01
  • You could also consider having a look at the `JXTreeTable` from SwingLabs SwingX library – MadProgrammer Jul 28 '15 at 00:21
  • @trashgod i have tried using a TableCellEditor, but failed, i don't know why, may be I was too stupid. Can you give me an example using my code ? Thank you. – Chuyang Jul 28 '15 at 03:11
  • @trashgod Thank you, it's ok , i have made it. – Chuyang Jul 28 '15 at 03:42

0 Answers0