2013-01-11 86 views
1

我有三个文件,TopicData,TopicView,TopicTableModel。我的程序使用数据库中的值显示一个表。现在,当我点击一行时,行的索引被打印出来。 我想修改代码,以便打印来自我的数据库的topicID。 topicID的值存储在ArrayList中,但未显示在表中,因此我无法使用JTable.getValueAt()。JTable:选择一行时从数据库中获取值

请告诉我如何修改我的代码。提前致谢。

的更多信息:

  1. TopicData从一个ArrayList数据库并存储它需要的数据。

  2. 然后将ArrayList传递给TopicTableModel,使数据适合在JTable中显示。

  3. TopicView创建一个JTable并接受TopicTableModel来生成JTable。

TopicData.java

public class TopicData { 
int id; 
String name; 
String date; 
String category; 
String user; 

public TopicData(){ 
} 

public TopicData(int id, String name, String date, String category, String user) { 
    this.id = id; 
    this.name = name; 
    this.date = date; 
    this.category = category; 
    this.user = user; 
} 



public TopicData(String name, String date, String category, String user) { 
    this.name = name; 
    this.date = date; 
    this.category = category; 
    this.user = user; 
} 

public int getId() { 
    return id; 
} 

public void setId(int id) { 
    this.id = id; 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public String getDate() { 
    return date; 
} 

public void setDate(String date) { 
    this.date = date; 
} 

public String getCategory() { 
    return category; 
} 

public void setCategory(String category) { 
    this.category = category; 
} 

public String getUser() { 
    return user; 
} 

public void setUser(String user) { 
    this.user = user; 
} 


public ArrayList<TopicData> getTopicList(){ 
    ArrayList<TopicData> topicList = new ArrayList<TopicData>(); 
    ResultSet rs = null; 
    DBController db = new DBController(); 
    db.setUp("myDatabase"); 
    String dbQuery = "SELECT topicID, topicName, topicDate, topicCategory, topicUser FROM topicTable ORDER BY topicDate"; 

    rs = db.readRequest(dbQuery); 

    try{ 
     while(rs.next()){ 
      int id = rs.getInt("topicID"); 
      String name = rs.getString("topicName"); 
      String date = rs.getString("topicDate") ; 
      String category = rs.getString("topicCategory"); 
      String user = rs.getString("topicUser"); 

      TopicData topic = new TopicData (id, name, date, category, user); 
      topicList.add(topic); 
     } 
    } catch (SQLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    db.terminate(); 
    return topicList; 
} 

TopicTableModel.java

public class TopicTableModel extends AbstractTableModel { 

private static final long serialVersionUID = 1L; 
private int rowCount, colCount; 
private String[] columnNames = {"Name", "Date", "User"}; 
private Object [][] data; 

public TopicTableModel(ArrayList<TopicData> listOfObjects) { 
    rowCount = listOfObjects.size(); 
    colCount = columnNames.length; 
    data = new Object[rowCount][colCount]; 

    for (int i = 0; i < rowCount; i++) { 
     //Copy an ArrayList element to an instance of MyObject 
     TopicData topic = (listOfObjects.get(i)); 
     data[i][0] = topic.getName();    
     data[i][1] = topic.getDate(); 
     data[i][2] = topic.getUser(); 
    }    
} 

@Override 
public int getColumnCount() { 
    // TODO Auto-generated method stub 
    return colCount; 
} 

@Override 
public int getRowCount() { 
    // TODO Auto-generated method stub 
    return rowCount; 
} 

@Override 
public String getColumnName(int col) { 
    return columnNames[col]; 
} 

@Override 
public Object getValueAt(int rowIndex, int columnIndex) { 
    // TODO Auto-generated method stub 
    return data[rowIndex][columnIndex]; 
} 

@Override 
public boolean isCellEditable(int rowIndex, int colIndex) { 
    return false; //Disallow the editing of any cell 
} 

} 

TopicView.java

private JTable getTable() { 
    if (table == null) { 
     TopicData topic= new TopicData(); 
     TopicTableModel tableModel = new TopicTableModel(topic.getTopicList()); 
     table = new JTable(tableModel); 

     table.setShowGrid(false); 
     table.setFillsViewportHeight(true); 
     table.setBounds(173, 87, 456, 263); 
     table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
     table.getTableHeader().setReorderingAllowed(false); 
     table.getTableHeader().setResizingAllowed(false); 
     table.getColumnModel().getColumn(0).setPreferredWidth(500); 

     ListSelectionModel rowSM = table.getSelectionModel(); 
     rowSM.addListSelectionListener(new ListSelectionListener() { 
      public void valueChanged(ListSelectionEvent e) { 
       //Ignore extra messages. 
       if (e.getValueIsAdjusting()) return; 

       ListSelectionModel lsm = (ListSelectionModel)e.getSource(); 
       if (lsm.isSelectionEmpty()) { 
        System.out.println("No rows are selected."); 
       } 
       else { 
        int selectedRow = lsm.getMinSelectionIndex(); 
        System.out.println("Row " + selectedRow + " is now selected."); 
       } 
      } 
     }); 
    } 
    return table; 
} 

回答

3

实际上,你的一切权利在你的鼻子。

您只需更改TableModel,以便保留ArrayList而不是将该列表转换为Object[][]

像这样的东西(可能有一些错字的问题):

public class TopicTableModel extends AbstractTableModel { 

private static final long serialVersionUID = 1L; 
private int rowCount, colCount; 
private String[] columnNames = {"ID", "Name", "Date", "User"}; 
private List<TopicData> listOfObjects; 
public TopicTableModel(ArrayList<TopicData> listOfObjects) { 
    this.listOfObjects = listOfObjects; 
} 

@Override 
public int getColumnCount() { 
    return columnNames.length; 
} 

@Override 
public int getRowCount() { 
    return listOfObjects.size(); 
} 

@Override 
public String getColumnName(int col) { 
    return columnNames[col]; 
} 

@Override 
public Object getValueAt(int rowIndex, int columnIndex) { 
    TopicData data = listOfObjects.get(rowIndex); 
    switch(columnIndex) { 
     case 0: 
      return data.getId(); 
     case 1: 
      return data.getName(); 
     case 2: 
      return data.getDate(); 
     case 3: 
      return data.getUser(); 
    } 
    return null; 
} 

@Override 
public boolean isCellEditable(int rowIndex, int colIndex) { 
    return false; //Disallow the editing of any cell 
} 

} 

副作用:你需要让你的TopicDataSerializable如果你使用Java序列化(或者利用Serializable其他技术)

+0

我认为AmuletxHeart想要打印的ID在println语句,在TopicView.java,而不是你做了添加ID列表。 – rob

+0

我刚刚使用这个并删除“return data.getId();”。我现在可以从数据库中获取ID,而不必在桌面上显示ID。谢谢。 – AmuletxHeart

+0

这个答案仍然不正确,因为它增加了另一列而不是解决问题中提出的问题。 – rob

4

你这样做是艰难的。不必将TopicData转换为数组,只需让TableModel直接读取TopicData对象的ArrayList,使每个TopicData对应一行。

TopicTableModel.java:

import java.util.ArrayList; 

import javax.swing.table.AbstractTableModel; 

public class TopicTableModel extends AbstractTableModel { 

private static final long serialVersionUID = 1L; 
private String[] columnNames = {"Name", "Date", "User"}; 
private ArrayList<TopicData> data; 

public TopicTableModel(ArrayList<TopicData> listOfObjects) { 
    data = listOfObjects; 
} 

@Override 
public int getColumnCount() { 
    return columnNames.length; 
} 

@Override 
public int getRowCount() { 
    return data.size(); 
} 

@Override 
public String getColumnName(int col) { 
    return columnNames[col]; 
} 

@Override 
public Object getValueAt(int rowIndex, int columnIndex) { 
    switch (column) { 
    case 0: 
     return data.getName(); 
    case 1: 
     return data.getDate(); 
    case 2: 
     return data.getUser(); 
    default: 
     throw new ArrayIndexOutOfBoundsException(); 
    } 
} 

@Override 
public boolean isCellEditable(int rowIndex, int colIndex) { 
    return false; //Disallow the editing of any cell 
} 

public TopicData getTopic(int row) { 
    return data.get(row); 
} 

} 

有一些小的修改TopicView.java,你现在可以得到TopicData对于选择的行并打印其ID。

TopicView.java:

import javax.swing.JTable; 
import javax.swing.ListSelectionModel; 
import javax.swing.event.ListSelectionEvent; 
import javax.swing.event.ListSelectionListener; 


public class TopicView { 
    JTable table; 

    private JTable getTable() { 
     if (table == null) { 
      TopicData topic= new TopicData(); 
      final TopicTableModel tableModel = new TopicTableModel(topic.getTopicList()); 
      table = new JTable(tableModel); 

      table.setShowGrid(false); 
      table.setFillsViewportHeight(true); 
      table.setBounds(173, 87, 456, 263); 
      table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
      table.getTableHeader().setReorderingAllowed(false); 
      table.getTableHeader().setResizingAllowed(false); 
      table.getColumnModel().getColumn(0).setPreferredWidth(500); 
      table.setDefaultRenderer(TopicData.class, new TopicDataTableCellRenderer()); 

      ListSelectionModel rowSM = table.getSelectionModel(); 
      rowSM.addListSelectionListener(new ListSelectionListener() { 
       public void valueChanged(ListSelectionEvent e) { 
        //Ignore extra messages. 
        if (e.getValueIsAdjusting()) return; 

        int row = table.getSelectedRow(); 
        if (row < 0) { 
         System.out.println("No rows are selected."); 
        } 
        else { 
         System.out.println("id " + tableModel.getTopic(row).getId() + " is now selected."); 
        } 
       } 
      }); 
     } 
     return table; 
    } 
} 
+0

我不会使用渲染器来选择要显示的数据。这会将您的TableModel(用于columnNames)和CellRenderer(如果有)与您的CellEditor一起收紧。 TableModel负责返回适当的数据。 –

+0

@rob错了,请不要,您的代码示例违反了几条规则, – mKorbel

+0

@mKorbel,请您详细说明一下吗? – rob

相关问题