2013-10-01 149 views
0

我想在某人單擊單元格時執行操作。例如打開另一個gui。但是,如何讓單元格可點擊但是不可編輯?這些是sql查詢的結果。儘管如此,我無法讓桌子變得不可編輯。我需要聽衆嗎?如果是的話我應該在哪裏放?JTable單元格不可編輯但可點擊

這裏是我的代碼:

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) { 
     } 


    } 

} 

回答

4

開始採取看看How to use tables

isCellEditable方法TableModel確定細胞的可編輯與否。此方法應返回false

當您直接向JTable提供列/數據信息時,JTable將在內部創建DefaultTableModel。此類的isCellEditiable默認情況下將返回true

通過使用類似DefaultTableModel的東西,您可以重寫此方法,而不會有太多麻煩,並將模型直接設置到表格中。

接下來,你需要一個MouseListener附加到表

看看How to write a Mouse Listener

然後,您可以使用getSelectedColumngetSelectedRow獲取所選單元格。

你還需要使用convertRowIndexToModelconvertColumnIndexToModel到視圖和模型係數之間的轉換

+1

爲OP理解,我認爲關鍵的一點,就是他們必須提供一個'TableModel'到JTable,而不是隻是直接使用數據構建它。帶有'isCellEditable()'的新的DefaultTableModel(){...}'應該可以解決這個問題。 – Josh

+0

它可能沒有足夠突出 - *「通過使用類似DefaultTableModel的,你可以重寫此方法,而不會有太多麻煩」* ... – MadProgrammer

+0

是的,我抓住了那部分,這就是爲什麼我評論,而不是添加一個新的回答。我自己可能不夠清楚;我的意思是,新手可能不太理解_how_或_where_「使用類似於」DefaultTableModel「的東西」 - 我的評論中的重點應該是「向JTable'提供一個TableModel ......」 ,你發佈的教程應該可以做到。 – Josh

相關問題