JTable未显示表头



我的目标是使用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;
}

我意识到我的表并没有在每列的顶部都有标题。https://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"。

我真的对此感到困惑,任何帮助都将不胜感激。

  • JTable放入JScrollPane

  • 否则必须将容器的LayoutManager更改为BorderLayout,然后将JTable放入CENTER area,将getTableHeaderJTable放入JTableHeader放入NORTH/SOUTH

  • 正确的方法是使用JScrollPane

编辑

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

覆盖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);

将您的表放在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; 
}

相关内容

  • 没有找到相关文章

最新更新