我想在表格中的每一行的最后一列都添加按钮,在点击某一行的按钮后删除那一行的信息(我的数据来自于数据库,用了TableModel表模型)求源代码加注释,谢谢!!!

解决方案 »

  1.   


    public class TableRenderDemo extends JPanel {
        private boolean DEBUG = false;    public TableRenderDemo() {
            super(new GridLayout(1,0));        JTable table = new JTable(new MyTableModel());
            table.setPreferredScrollableViewportSize(new Dimension(500, 70));
            table.setFillsViewportHeight(true);        //Create the scroll pane and add the table to it.
            JScrollPane scrollPane = new JScrollPane(table);        //Set up column sizes.
            initColumnSizes(table);        //Fiddle with the Sport column's cell editors/renderers.
            setUpSportColumn(table, table.getColumnModel().getColumn(2));        //Add the scroll pane to this panel.
            add(scrollPane);
        }    /*
         * This method picks good column sizes.
         * If all column heads are wider than the column's cells'
         * contents, then you can just use column.sizeWidthToFit().
         */
        private void initColumnSizes(JTable table) {
            MyTableModel model = (MyTableModel)table.getModel();
            TableColumn column = null;
            Component comp = null;
            int headerWidth = 0;
            int cellWidth = 0;
            Object[] longValues = model.longValues;
            TableCellRenderer headerRenderer =
                table.getTableHeader().getDefaultRenderer();        for (int i = 0; i < 5; i++) {
                column = table.getColumnModel().getColumn(i);            comp = headerRenderer.getTableCellRendererComponent(
                                     null, column.getHeaderValue(),
                                     false, false, 0, 0);
                headerWidth = comp.getPreferredSize().width;            comp = table.getDefaultRenderer(model.getColumnClass(i)).
                                 getTableCellRendererComponent(
                                     table, longValues[i],
                                     false, false, 0, i);
                cellWidth = comp.getPreferredSize().width;            if (DEBUG) {
                    System.out.println("Initializing width of column "
                                       + i + ". "
                                       + "headerWidth = " + headerWidth
                                       + "; cellWidth = " + cellWidth);
                }            column.setPreferredWidth(Math.max(headerWidth, cellWidth));
            }
        }    public void setUpSportColumn(JTable table,
                                     TableColumn sportColumn) {
            //Set up the editor for the sport cells.
            JComboBox comboBox = new JComboBox();
            comboBox.addItem("Snowboarding");
            comboBox.addItem("Rowing");
            comboBox.addItem("Knitting");
            comboBox.addItem("Speed reading");
            comboBox.addItem("Pool");
            comboBox.addItem("None of the above");
            
    //        sportColumn.setCellEditor(new DefaultCellEditor(comboBox));
            
            //Set up tool tips for the sport cells.
    //        DefaultTableCellRenderer renderer = new DefaultTableCellRenderer();
            
    //        renderer.setToolTipText("Click for combo box");
            sportColumn.setCellRenderer(new MyButtonRender());
            sportColumn.setCellEditor(new MyButtonEditor());
        }
            /**
         * 自定义一个往列里边添加按钮的单元格编辑器。最好继承DefaultCellEditor,不然要实现的方法就太多了。
         * 
         */
        public class MyButtonEditor extends DefaultCellEditor
        {        /**
             * serialVersionUID
             */
            private static final long serialVersionUID = -6546334664166791132L;        private JPanel panel;        private JButton button;        public MyButtonEditor()
            {
                // DefautlCellEditor有此构造器,需要传入一个,但这个不会使用到,直接new一个即可。
                super(new JTextField());            // 设置点击几次激活编辑。
                this.setClickCountToStart(1);            this.initButton();            this.initPanel();            // 添加按钮。
                this.panel.add(this.button);
            }        private void initButton()
            {
                this.button = new JButton("编辑");            // 设置按钮的大小及位置。
                this.button.setBounds(0, 0, 50, 15);            // 为按钮添加事件。这里只能添加ActionListner事件,Mouse事件无效。
                this.button.addActionListener(new ActionListener()
                {
                    public void actionPerformed(ActionEvent e)
                    {
                        // 触发取消编辑的事件,不会调用tableModel的setValue方法。
                        MyButtonEditor.this.fireEditingCanceled();
                        JOptionPane.showMessageDialog(null,"Eggs are not supposed to be green.");
                        // 这里可以做其它操作。
                        // 可以将table传入,通过getSelectedRow,getSelectColumn方法获取到当前选择的行和列及其它操作等。
                    }
                });        }        private void initPanel()
            {
                this.panel = new JPanel();            // panel使用绝对定位,这样button就不会充满整个单元格。
                this.panel.setLayout(null);
            }
            /**
             * 这里重写父类的编辑方法,返回一个JPanel对象即可(也可以直接返回一个Button对象,但是那样会填充满整个单元格)
             */
            @Override
            public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column)
            {
                // 只为按钮赋值即可。也可以作其它操作。
                this.button.setText(value == null ? "" : String.valueOf(value));            return this.panel;
            }        /**
             * 重写编辑单元格时获取的值。如果不重写,这里可能会为按钮设置错误的值。
             */
            @Override
            public Object getCellEditorValue()
            {
                return this.button.getText();
            }    }代码1,上
      

  2.   


       public class MyButtonRender implements TableCellRenderer
        {
            private JPanel panel;        private JButton button;        public MyButtonRender()
            {
                this.initButton();            this.initPanel();            // 添加按钮。
                this.panel.add(this.button);
            }        private void initButton()
            {
                this.button = new JButton("编辑");            // 设置按钮的大小及位置。
                this.button.setBounds(0, 0, 50, 15);            // 在渲染器里边添加按钮的事件是不会触发的
                // this.button.addActionListener(new ActionListener()
                // {
                //
                // public void actionPerformed(ActionEvent e)
                // {
                // // TODO Auto-generated method stub
                // }
                // });        }        private void initPanel()
            {
                this.panel = new JPanel();            // panel使用绝对定位,这样button就不会充满整个单元格。
                this.panel.setLayout(null);
            }        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row,
                    int column)
            {
                // 只为按钮赋值即可。也可以作其它操作,如绘背景等。
                this.button.setText(value == null ? "" : String.valueOf(value));            return this.panel;
            }    }    
        class MyTableModel extends AbstractTableModel {
            private String[] columnNames = {"First Name",
                                            "Last Name",
                                            "Sport",
                                            "# of Years",
                                            "Vegetarian"};
            private Object[][] data = {
        {"Kathy", "Smith",
         "Snowboarding", new Integer(5), new Boolean(false)},
        {"John", "Doe",
         "Rowing", new Integer(3), new Boolean(true)},
        {"Sue", "Black",
         "Knitting", new Integer(2), new Boolean(false)},
        {"Jane", "White",
         "Speed reading", new Integer(20), new Boolean(true)},
        {"Joe", "Brown",
         "Pool", new Integer(10), new Boolean(false)}
            };        public final Object[] longValues = {"Jane", "Kathy",
                                                "None of the above",
                                                new Integer(20), Boolean.TRUE};        public int getColumnCount() {
                return columnNames.length;
            }        public int getRowCount() {
                return data.length;
            }        public String getColumnName(int col) {
                return columnNames[col];
            }        public Object getValueAt(int row, int col) {
                return data[row][col];
            }        /*
             * JTable uses this method to determine the default renderer/
             * editor for each cell.  If we didn't implement this method,
             * then the last column would contain text ("true"/"false"),
             * rather than a check box.
             */
            public Class getColumnClass(int c) {
                return getValueAt(0, c).getClass();
            }        /*
             * Don't need to implement this method unless your table's
             * editable.
             */
            public boolean isCellEditable(int row, int col) {
                //Note that the data/cell address is constant,
                //no matter where the cell appears onscreen.
                if (col == 10) {
                    return false;
                } else {
                    return true;
                }
            }        /*
             * Don't need to implement this method unless your table's
             * data can change.
             */
            public void setValueAt(Object value, int row, int col) {
                if (DEBUG) {
                    System.out.println("Setting value at " + row + "," + col
                                       + " to " + value
                                       + " (an instance of "
                                       + value.getClass() + ")");
                }            data[row][col] = value;
                fireTableCellUpdated(row, col);            if (DEBUG) {
                    System.out.println("New value of data:");
                    printDebugData();
                }
            }        private void printDebugData() {
                int numRows = getRowCount();
                int numCols = getColumnCount();            for (int i=0; i < numRows; i++) {
                    System.out.print("    row " + i + ":");
                    for (int j=0; j < numCols; j++) {
                        System.out.print("  " + data[i][j]);
                    }
                    System.out.println();
                }
                System.out.println("--------------------------");
            }
        }    /**
         * Create the GUI and show it.  For thread safety,
         * this method should be invoked from the
         * event-dispatching thread.
         */
        private static void createAndShowGUI() {
            //Create and set up the window.
            JFrame frame = new JFrame("TableRenderDemo");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        //Create and set up the content pane.
            TableRenderDemo newContentPane = new TableRenderDemo();
            newContentPane.setOpaque(true); //content panes must be opaque
            frame.setContentPane(newContentPane);        //Display the window.
            frame.pack();
            frame.setVisible(true);
        }    public static void main(String[] args) {
            //Schedule a job for the event-dispatching thread:
            //creating and showing this application's GUI.
            javax.swing.SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    createAndShowGUI();
                }
            });
        }
    }代码2上
      

  3.   

    代码2中的第124行的DEBUG在哪里,if(DEBUG){}又是什么意思?