Java JTable单元格不可编辑,但可单击

Java JTable单元格不可编辑,但可单击,java,swing,jtable,clickable,Java,Swing,Jtable,Clickable,每当有人点击一个单元格时,我都要执行一个操作。例如,打开另一个gui。但如何使单元格可单击但不可编辑?这些是sql查询的结果。不过,我无法使这张桌子不可编辑。我需要一个听众还是什么?如果是,我应该把它放在哪里 这是我的密码: public class AllResultsFromDB extends JFrame { GUI ins = new GUI(); public AllResultsFromDB(GUI x) { Vector columnN

每当有人点击一个单元格时,我都要执行一个操作。例如,打开另一个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) {
        }


    }

}
公共类AllResultsFromDB扩展JFrame
{
GUI-ins=newgui();
公共AllResultsFromDB(GUI x)
{
向量列名称=新向量();
向量数据=新向量();
这是1.ins=x;
尝试
{   
//初始化GUI类以调用getSelectedTable()方法。
//GUI-ins=newgui();
//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());
//从用户指定的表中获取数据
String query=“SELECT*FROM”+ins.getSelectedTable()+“ORDER BY id”;
System.out.println(查询);
语句stmt=connection.createStatement();
ResultSet rset=stmt.executeQuery(查询);
ResultSetMetaData metad=rset.getMetaData();
int columns=metad.getColumnCount();
//此循环获取列的名称

对于(inti=1;i而言,首先查看

isCellEditable
方法
TableModel
确定单元格的属性是否可编辑。此方法应返回
false

当您直接向
JTable
提供列/数据信息时,
JTable
在内部创建一个
DefaultTableModel
。默认情况下,此类的
iscelleditable
方法将返回
true

通过使用类似于
DefaultTableModel
的方法,您可以不费吹灰之力地重写此方法,并直接将模型设置到表中

接下来,您需要将一个
MouseListener
附加到表中

看看

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


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

isCellEditable
方法
TableModel
确定单元格的属性是否可编辑。此方法应返回
false

当您直接向
JTable
提供列/数据信息时,
JTable
在内部创建一个
DefaultTableModel
。默认情况下,此类的
iscelleditable
方法将返回
true

通过使用类似于
DefaultTableModel
的方法,您可以不费吹灰之力地重写此方法,并直接将模型设置到表中

接下来,您需要将一个
MouseListener
附加到表中

看看

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


您还需要使用视图索引和模型索引,并在它们之间进行转换,我认为OP要理解的关键是,它们必须为JTable提供一个
TableModel
,而不是直接使用数据来构建它
Overwrited应该可以做到这一点。它可能没有足够突出显示-“通过使用DefaultTableModel之类的工具,您可以轻松地覆盖此方法”…是的,我抓住了这一部分,这就是为什么我没有添加新答案而发表评论的原因。我自己可能还不够清楚;我的意思是,新来者可能不太明白如何或在哪里“使用类似
DefaultTableModel的东西”
——我评论中的重点应该是“向
JTable
提供
TableModel
。。。"我同意你的评论和反馈,希望更新后的答案能提供更多的信息OP要理解的关键是,他们必须为JTable提供一个
TableModel
,而不是直接使用数据构建它。a
新的DefaultTableModel(){…}
isCellEditable()
覆盖应该可以做到这一点。它可能没有足够突出显示—“通过使用DefaultTableModel之类的工具,您可以覆盖此方法而不会有太多麻烦”…是的,我抓住了这一部分,这就是为什么我没有添加新答案而发表评论的原因。我自己可能还不够清楚;我的意思是,新来者可能不太明白如何或在哪里“使用类似
DefaultTableModel的东西”
——我评论中的重点应该是“为
JTable
提供一个
TableModel
。”也就是说,你发布的教程应该能起到作用。我同意你的评论和反馈,希望更新后的答案能提供更多的信息