2012-12-23 62 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