2

我的目标是使用 JTable 显示数据库中的数据。

参考代码来自:从 ResultSet 填充 JTable 的最简单代码

我修改了代码以适应我的情况。我有一个具有以下方法的类 TopicData:

public DefaultTableModel buildTableModel(){
    //open connection
    ResultSet rs = null;
    Vector<String> columnNames = new Vector<String>();
    Vector<Vector<Object>> data = new Vector<Vector<Object>>();
    int columnCount = 0;
    DBController db = new DBController();
    db.setUp("myDatabase");
    String dbQuery = "SELECT topicName, topicDate, topicCategory, topicUser FROM topicTable ORDER BY topicDate";

    rs = db.readRequest(dbQuery);
    try{    
        ResultSetMetaData metaData = rs.getMetaData();

        // names of columns
        columnCount = metaData.getColumnCount();
        for (int column = 1; column <= columnCount; column++) {
            columnNames.add(metaData.getColumnName(column));

        }
        // data of the table 
        while (rs.next()) {
            Vector<Object> vector = new Vector<Object>();
            for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) {
                vector.add(rs.getObject(columnIndex));
            }
            data.add(vector);
        }
    } 
    catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    //close connection 
    db.terminate();

    return new DefaultTableModel(data, columnNames);

}

在另一个类 TopicView 中:

private JTable getTable() {
    if (table == null) {
        TopicData topic= new TopicData();
        table = new JTable(topic.buildTableModel());
        table.setShowGrid(false);
        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        table.setBounds(95, 59, 625, 357);
    }
    return table;
}

我意识到我的表格在每列的顶部没有标题。 http://i.stack.imgur.com/FcnHb.png

因此,我简化了我的 TopicData 以进行故障排除:

public DefaultTableModel testTableModel(){
    Vector<String> columnNames = new Vector<String>();
    columnNames.add("test1");
    columnNames.add("test1");
    columnNames.add("test1");
    Vector<Vector<Object>> data = new Vector<Vector<Object>>();
    Vector<Object>vector = new Vector<Object>();
    vector.add("test2");
    vector.add("test2");
    vector.add("test2");
    data.add(vector);

    return new DefaultTableModel(data, columnNames);
}

再一次,该表没有标题。“test1”这个词没有出现在表格的任何地方,而“test2”显示了3列。

我对此感到非常困惑,任何帮助将不胜感激。

4

2 回答 2

4

编辑

如何使表格中的字段不可编辑?现在,如果我双击,我可以编辑单元格的内容

覆盖两个方法DefaultTableModel,伪代码

model = new DefaultTableModel(data, columnNames) {

    private static final long serialVersionUID = 1L;

    @Override
    public Class getColumnClass(int column) {
        return getValueAt(0, column).getClass();
    }

    @Override
    public boolean isCellEditable(int row, int column) {
        return false;
    }
};
table = new JTable(model);
于 2013-01-10T13:50:54.950 回答
1

把你的桌子放在JScrollPane.

例子:

container.add(new JScrollPane(table));

或者您可以通过直接添加到容器来做到这一点(如javadoc中所述)

container.setLayout(new BorderLayout());
container.add(table.getTableHeader(), BorderLayout.PAGE_START);
container.add(table, BorderLayout.CENTER);

关于如何使单元格不可编辑的问题是,

覆盖 isCellEditable(..) 在您的TableModel

@Override
public boolean isCellEditable(int rowIndex, int colIndex) {
    // return false for not making it editable.
     return false; 

}
于 2013-01-10T14:09:54.527 回答