java怎样在表格中添加按钮??

Daniel Mao 2013-08-18 05:08:18
我想在表格中的每一行的最后一列都添加按钮,在点击某一行的按钮后删除那一行的信息(我的数据来自于数据库,用了TableModel表模型)求源代码加注释,谢谢!!!
...全文
1065 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Daniel Mao 2013-08-25
  • 打赏
  • 举报
回复
代码2中的第124行的DEBUG在哪里,if(DEBUG){}又是什么意思?
evangelionxb 2013-08-19
  • 打赏
  • 举报
回复

   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上
evangelionxb 2013-08-19
  • 打赏
  • 举报
回复

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,上

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧