【问题标题】:JTable cell not editable but clickableJTable 单元格不可编辑但可点击
【发布时间】:2013-10-01 10:45:17
【问题描述】:

每当有人单击单元格时,我想执行一个操作。例如,打开另一个 gui。但是我如何使单元格可点击但不可编辑?这些是 sql 查询的结果。不过,我无法使表格不可编辑。我需要一个听众还是什么?如果是,我应该把它放在哪里?

这是我的代码:

public class AllResultsFromDB extends JFrame
{

    GUI ins = new GUI();

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

        Vector data = new Vector();
        this.ins = x;

        try
        {   
            // Initializing GUI class in order to call getSelectedTable() method.
//            GUI ins = new GUI();
            //System.out.println(ins.getSelectedTable());
            Login sgui = new Login();

            String dburl = "jdbc:oracle:thin:@localhost:1521:ORCL";
            Connection connection = DriverManager.getConnection( dburl, sgui.getUsername(), sgui.getPassword() );


            //  Fetch data from table specified by user

            String query = "SELECT * FROM "  + ins.getSelectedTable() + " ORDER BY id";
            System.out.println(query);
            Statement stmt = connection.createStatement();
            ResultSet rset = stmt.executeQuery(query);   
            ResultSetMetaData metad = rset.getMetaData();
            int columns = metad.getColumnCount();



            //  This loop gets the names of the columns

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




            //  This loop gets the data inside the rows

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

                //Vector b = new Vector((Collection)button);

                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

        JTable table = new JTable(data, columnNames)
        { 

            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 );
        //table.addMouseListener(l);
        //table.setEnabled(false);
        //table.setDragEnabled(true);



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

    } catch (SQLException e) {
        }


    }

}

【问题讨论】:

    标签: java swing jtable clickable


    【解决方案1】:

    先看看How to use tables

    TableModel 确定单元格的isCellEditable 方法是否可编辑。这个方法应该返回false

    当您直接向JTable 提供列/数据信息时,JTable 在内部创建一个DefaultTableModel。这个类的isCellEditiable方法默认会返回true

    通过使用DefaultTableModel 之类的东西,您可以轻松地重写此方法并将模型直接设置到表中。

    接下来,您需要在表格中附加一个MouseListener

    看看How to write a Mouse Listener

    然后您可以使用getSelectedColumngetSelectedRow 来获取选定的单元格。

    您还需要使用convertRowIndexToModelconvertColumnIndexToModel 在视图和模型索引之间进行转换

    【讨论】:

    • 我认为,OP 要理解的关键是他们必须为 JTable 提供TableModel,而不是直接使用数据构造它。覆盖isCellEditable()new DefaultTableModel(){...} 应该可以解决问题。
    • 它可能不够突出 - “通过使用 DefaultTableModel 之类的东西,您可以轻松地覆盖此方法”...
    • 是的,我抓住了那部分,这就是我评论而不是添加新答案的原因。我自己可能还不够清楚;我的意思是新手可能不太了解如何在哪里“使用DefaultTableModel之类的东西”——我评论中的重点应该是“JTable 提供TableModel...”也就是说,您发布的教程应该可以解决问题。
    • 我同意您的评论和反馈,希望更新后的答案能提供更多信息
    猜你喜欢
    • 2010-11-19
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多