2012-12-23 56 views
-1

我嘗試從jTable中選擇一行並將值存儲到topicId中。這是我的代碼。getSelectedRow方法保持返回行0

jTable.addMouseListener(new java.awt.event.MouseAdapter() { 
      public void mouseClicked(java.awt.event.MouseEvent e) { 
      if (jTable.getSelectedRow() >= 0 && jTable.getValueAt(jTable.getSelectedRow(), 0) != null) { 
        topicId = (Integer)jTable.getValueAt(jTable.getSelectedRow(), 0);} 

      System.out.println(topicId); 
       eForumTopics topics = new eForumTopics(topicId); 
       topics.retrieveThread(); 
       getJFrame().dispose(); 
       eForumThreadContent myWindow = new eForumThreadContent(topicId); 
       myWindow.getJFrame().setVisible(true); 
      } 
     }); 
    } 

這是我的滾動窗格的代碼。

private JScrollPane getJScrollPane() { 
    if (jScrollPane == null) { 
     jScrollPane = new JScrollPane(); 
     jScrollPane.setBounds(new Rectangle(75, 220, 800, 450)); 
     jScrollPane.setViewportView(getJTable()); 
    } 
    return jScrollPane; 
} 

這裏是jTable的代碼。

private JTable getJTable() { 
    if (jTable == null) { 
     Vector columnNames = new Vector(); // Vector class allows dynamic 
              // array of objects 
     Vector data = new Vector(); 
     try { 
      DBController db = new DBController(); 
      db.setUp("IT Innovation Project"); 
      Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance(); 
      String dsn = "IT Innovation Project"; 
      String s = "jdbc:odbc:" + dsn; 
      Connection con = DriverManager.getConnection(s, "", ""); 
      String sql = "Select topic_title,topic_description,topic_by from forumTopics WHERE topic_category = '"+category+"'"; 
      java.sql.Statement statement = con.createStatement(); 
      ResultSet resultSet = statement.executeQuery(sql); 
      ResultSetMetaData metaData = resultSet.getMetaData(); 
      int columns = metaData.getColumnCount(); 
      for (int i = 1; i <= columns; i++) { 
       columnNames.addElement(metaData.getColumnName(i)); 
      } 
      while (resultSet.next()) { 
       Vector row = new Vector(columns); 
       for (int i = 1; i <= columns; i++) { 
        row.addElement(resultSet.getObject(i)); 
       } 
       data.addElement(row); 
      } 
      resultSet.close(); 
      ((Connection) statement).close(); 
     } catch (Exception e) { 
      System.out.println(e); 
     } 
     jTable = new JTable(data, columnNames); 
     TableColumn column; 
     for (int i = 0; i < jTable.getColumnCount(); i++) { 
      column = jTable.getColumnModel().getColumn(i); 
      if (i == 1) { 
       column.setPreferredWidth(400); // second column is bigger 
      }else { 
       column.setPreferredWidth(200); 
      } 
     } 
     String header[] = { "Title", "Description", "Posted by" }; 

     for (int i = 0; i < jTable.getColumnCount(); i++) { 
      TableColumn column1 = jTable.getTableHeader().getColumnModel() 
        .getColumn(i); 

      column1.setHeaderValue(header[i]); 
     } 
     jTable.getTableHeader().setFont(new Font("Dialog" , Font.PLAIN, 20)); 
     jTable.getTableHeader().setForeground(Color.white); 
     jTable.getTableHeader().setBackground(new Color(102, 102, 102)); 
     jTable.setEnabled(false); 
     jTable.setRowHeight(100); 
     jTable.getRowHeight(); 
     jTable.setFont(new Font("Dialog" , Font.PLAIN, 18)); 
     jTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 

我不知道我的表格或滾動窗格是否有問題。無論何時我在jTable中選擇了任何行,例如4或5或6,結果都會讓我返回0行。有人可以提供幫助嗎?提前致謝。

+0

無關:不要做任何手工上漿/定位(如fi setBounds),這是layoutManager的獨家任務 – kleopatra

回答

4

添加鼠標偵聽器將所選行存儲在字段中沒有任何意義。該表知道其選定的行,而且,選擇可以在不使用鼠標的情況下改變。

如果你想要做的事(如選擇行的加載細節),每次選擇更改,然後添加一個選擇偵聽器:

table.getSelectionModel().addListSelectionListener(new ListSelectionListener() { 
    @Override 
    public void valueChanged(ListSelectionEvent e) { 
     if (!e.getValueIsAdjusting()) { 
      int viewRow = table.getSelectedRow(); 
      if (viewRow >= 0) { 
       int modelRow = table.convertRowIndexToModel(); 
       Integer topicId = tableModel.getTopicIdAtRow(modelRow); 
       // todo load the details for topicId 
      } 
     } 
    } 
}); 
+0

有沒有其他方法可以堅持我發佈的代碼?即使我將選定的行方法從鼠標偵聽器中移出,它仍然不起作用。我對這個領域仍然陌生,所以你的代碼對我來說看起來相當高標準。 – GabrielHeng

+1

我不明白你的問題。鼠標偵聽器用於檢測鼠標點擊。您想要檢測JTable選擇的更改,因此鼠標偵聽器不是適當的工具。如果你不明白我的代碼是幹什麼的,爲什麼這樣做,那麼首先閱讀所用方法的javadoc,如果你還不明白,那麼問我。但繼續使用這個不好的工具來完成這項工作並不會帶領你到任何地方。 –

+0

那麼如何通過點擊某一行鏈接到另一個頁面呢?因爲從你的代碼權利,我不能點擊表格。 – GabrielHeng