使Jtable不可编辑

时间:2013-10-01 15:56:18

标签: java swing jtable

我有一个可点击的表,但是当我双击时,它不是按照它所说的去做,而是进入编辑模式。我尝试过isCellEditable()方法但没有成功。也许我做错了什么?

以下是代码:

public AllResultsFromDB(GUI x) {
   final Vector columnNames = new Vector();
   final Vector data = new Vector();


        for (int i = 1; i <= columns; i++) {
            columnNames.addElement(metad.getColumnName(i));
        }


        //  This loop gets the data inside the rows

        while (rset.next()) {
            final Vector row = new Vector(columns);


            for (int i = 1; i <= columns; i++) {
                row.addElement(rset.getObject(i));

            }

            data.addElement(row);
            //data.addElement(b);
        }

        rset.close();
        stmt.close();
        connection.close();


        //  Create table with results

      final JTable  table = new JTable(data, columnNames) {


            public boolean isCellEditable() {
                           return false;
                       }



            public Class getColumnClass(int column) {

                for (int row = 0; row < getRowCount(); row++) {


                    Object obj = getValueAt(row, column);




                    if (obj != null) {

                        return obj.getClass();

                    } 
                } 

                return Object.class;
            }


        };


        JScrollPane scroll = new JScrollPane(table);
        getContentPane().add(scroll);


        JPanel panel = new JPanel();
        getContentPane().add(panel, BorderLayout.SOUTH);


        table.addMouseListener(new MouseListener() {

            public void mousePressed(MouseEvent e) {

                //System.out.println(table.getSelectedRow());

            }

            public void mouseReleased(MouseEvent e) {
                //System.out.println(table.getSelectedRow());

            }

            public void mouseEntered(MouseEvent e) {
                //System.out.println(table.getSelectedRow());

            }

            public void mouseExited(MouseEvent e) {
                //System.out.println(table.getSelectedRow());
            }

            public void mouseClicked(MouseEvent e) {

                if(e.getClickCount()==2){


                System.out.println(table.getSelectedRow());
            }

            }
        });

2 个答案:

答案 0 :(得分:3)

您尝试覆盖的方法isCellEditable具有不同的签名:

public boolean isCellEditable(int row, int column) 

你怎么能指定哪个特定的细胞呢?下次添加@Override注释时,应该有助于发现这一点。

在任何情况下,这都不是使JTable不可编辑的正确方法。正确的方法是提供一个自定义AbstractTableModel,它使用isCellEditable方法返回false。 JTable不应该决定一个单元格是否可编辑,模型有责任决定它:JTable的isCellEditable方法只是询问其模型是否可编辑单元格。 JTable显示内容,仅此而已,它是决定和包含数据的模型。

由于您似乎只使用JTable的基本功能,因此您无需滚动自己的表模型,DefaultTableModel将适用于您,并且您可以覆盖其isCellEditable方法。< / p>

答案 1 :(得分:2)

你不是那么遥远。

实际方法isCellEditable有两个参数,所以你的方法实际上没有覆盖任何东西。

请参阅:http://docs.oracle.com/javase/7/docs/api/javax/swing/table/TableModel.html#isCellEditable%28int,%20int%29

正确的方法。