结果集中的 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 组件,并且只是这次重新创建了它们,除了控件的大小以满足我的需要外,我没有做任何更改;没有其他选项被篡改。
这次效果和预期的一样。
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 组件,并且只是这次重新创建了它们,除了控件的大小以满足我的需要外,我没有做任何更改;没有其他选项被篡改。
这次效果和预期的一样。