结果集中的 JTable 不垂直滚动

JTable from Resultset not scrolling vertically

JTable 组件出现问题已有一个多星期了。希望你能给我指明正确的方向。

在 JInternalFrame 表单中,我创建了一个 JTable(在 NetBeans 自动生成的代码中):

    jScrollPane1 = new javax.swing.JScrollPane();
    tblData = new javax.swing.JTable();
    jScrollPane1.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
    jScrollPane1.setMaximumSize(new java.awt.Dimension(468, 167));
    jScrollPane1.setMinimumSize(new java.awt.Dimension(468, 167));
    jScrollPane1.setPreferredSize(new java.awt.Dimension(453, 167));

    tblData.setFont(new java.awt.Font("Arial", 1, 12)); // NOI18N
    tblData.setModel(new javax.swing.table.DefaultTableModel(
        new Object [][] {

        },
        new String [] {
            "ID Empresa", "Código Empresa", "Nombre de la Empresa"
        }
    ));
    tblData.setFillsViewportHeight(true);
    tblData.setIntercellSpacing(new java.awt.Dimension(5, 5));
    tblData.setMaximumSize(new java.awt.Dimension(300, 100));
    tblData.setMinimumSize(new java.awt.Dimension(300, 100));
    tblData.setName(""); // NOI18N
    tblData.setPreferredSize(new java.awt.Dimension(300, 100));
    tblData.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
    jScrollPane1.setViewportView(tblData);

table tblData 从正确加载的结果集中填充(数据已通过 System.out.println() 验证)。现在,事情是一旦数据被检索,一个函数被调用到 "refresh" table 如下:

private void prepareTable(boolean isEmpty) {
    String[] colHeadings = {"ID Empresa","Código Empresa","Nombre de la Empresa"};

    DefaultTableModel model = new DefaultTableModel();
  tblData.setPreferredScrollableViewportSize(tblData.getPreferredSize());

    try {
        if (isEmpty) {
            model.setColumnIdentifiers(colHeadings);
            tblData.setModel(model);
        } else {
            Verbo.rs.beforeFirst();

            tblData.setModel(DbUtils.resultSetToTableModel(Verbo.rs));
        }
    } catch (SQLException se) {

    }
    ((DefaultTableModel) tblData.getModel()).fireTableStructureChanged();

}

问题是,虽然行被检索并加载到 table 模型,但 table 的垂直滚动条即使显示也不起作用,因此只有第一个显示记录。

我正在做的事情有什么明显的错误吗?请帮助我,因为我已经搜索过这里和其他网站上的所有答案都没有用。

提前致谢。

基本上,使用 setPreferred/Minimum/MaximumSize 会给你带来问题,你也应该小心使用 setPreferredScrollableViewportSize 并且永远不要使用组件的 preferredSize 因为这会使滚动窗格需要与组件大小相同。

你也可以看看Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?

我知道这可能不是 "best" 解决方案,但出于绝望我尝试了它并且成功了:

  • 简单地说,我从表单中删除了 jTable 和 jScrollPane 组件,并且只是这次重新创建了它们,除了控件的大小以满足我的需要外,我没有做任何更改;没有其他选项被篡改。

这次效果和预期的一样。