JTable没有显示表头

时间:2013-01-10 13:49:28

标签: java database swing user-interface jtable

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

引用以下代码:Most simple code to populate JTable from ResultSet

我修改了代码以适应我的情况。我有一个类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”不会出现在桌面上的任何位置,而显示有3列“test2”。

我真的很困惑,任何帮助都会受到赞赏。

2 个答案:

答案 0 :(得分:4)

修改

  

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

覆盖JScrollPane,pseudo_code

的两种方法
DefaultTableModel

答案 1 :(得分:1)

将您的表放在JScrollPane

示例:

container.add(new JScrollPane(table));

或者您可以直接添加到容器中(如javadoc中所述)

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

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

TableModel

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

}