【问题标题】:JTable from Resultset not scrolling vertically结果集中的JTable不垂直滚动
【发布时间】:2016-03-13 08:56:45
【问题描述】:

一个多星期以来,我一直在使用 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);

tblData 由正确加载的ResultSet 填充(数据已通过System.out.println() 验证)。现在,问题是一旦检索到数据,就会调用一个函数来“刷新”表,如下所示:

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();

}

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

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

提前谢谢你。

【问题讨论】:

  • 你应该处理异常。也许它会给你关于正在发生的事情的信息。
  • 感谢@YassinHajaj 的评论,我添加了一般异常,但没有抛出任何异常。显然没有发生错误。
  • 请发mcve
  • 不要使用 tblData.setPreferredScrollableViewportSize(tblData.getPreferredSize());或 ((DefaultTableModel) tblData.getModel()).fireTableStructureChanged()
  • 不要使用 setPreferred/Minimum/MaximumSize,它会严重影响你

标签: java swing jtable jscrollpane tablemodel


【解决方案1】:

基本上,使用setPreferred/Minimum/MaximumSize 会导致您出现问题,您还应该小心使用setPreferredScrollableViewportSize,并且永远不要使用组件的preferredSize,因为这会使滚动窗格希望与组件的大小相同.

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

【讨论】:

    【解决方案2】:

    我知道这也许不是“最好”的解决方案,但出于绝望,我尝试了它并成功了:

    • 我只是从表单中删除了 jTable 和 jScrollPane 组件,然后重新创建了它们,只是这次我没有改变任何东西,除了控件的大小来满足我的需要;没有其他选项被篡改。

    而这一次,它按预期工作了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-01
      • 2019-10-04
      • 2018-03-09
      相关资源
      最近更新 更多