为什么我的JTable中的数据仅在选中对应行后才可见?
JTable初始为空、选中后才显示内容的原因及解决方案
问题现象
实现的JTable数据来源于字符串集合,运行程序后默认显示为空,只有选中对应行后才会完整展示所有数据:
- 运行初始效果:

- 选中行后效果:

核心问题原因
代码存在两处关键错误,共同导致了渲染异常:
- JScrollPane添加JTable的方式错误:Swing的
JScrollPane有独立的视口(Viewport)管理机制,不能直接调用add()方法添加子组件,你写的scrollPane.add(tabla)实际上没有把表格放到滚动面板的渲染视口中,初始状态下表格内容不会被自动绘制,只有选中时触发单元格强制重绘才会显示内容。 - 额外问题:你使用了绝对布局
setLayout(null),且手动设置了所有组件的固定大小,后续如果容器尺寸发生变化,还会出现更多渲染异常。
修复方案
只需要修改JTable和JScrollPane的关联逻辑即可,两种修改方式二选一:
方式1:创建JScrollPane时直接传入JTable(推荐写法)
将原构造方法中
scrollPane = new JScrollPane(); scrollPane.add(tabla);
改为
scrollPane = new JScrollPane(tabla);
方式2:手动设置视口组件
将scrollPane.add(tabla)替换为:
scrollPane.setViewportView(tabla);
修正后的完整代码
public class PanelConsulta1 extends JPanel { private String[] nombresColumnas = {"Ciudad de Residencia", "Salario Promedio"}; private JScrollPane scrollPane; private JTable tabla; private controlador control; public PanelConsulta1(){ control = new controlador(); setSize(400, 400); // 后续可替换为BorderLayout适配大小变化:setLayout(new BorderLayout()); setLayout(null); tabla = new JTable(inicializarTabla()); // 修正:创建滚动面板时直接传入表格 scrollPane = new JScrollPane(tabla); scrollPane.setSize(400, 400); tabla.setFillsViewportHeight(true); add(scrollPane); setVisible(true); } private DefaultTableModel inicializarTabla(){ ArrayList<Consulta1Vo> lista = null; Object[][] ayudante = null; DefaultTableModel modelo = new DefaultTableModel(nombresColumnas, 0); try { lista = control.consultarRequerimiento1(); ayudante = new Object[lista.size()][2]; } catch (Exception e) { e.printStackTrace(); } for (int i = 0; i < lista.size(); i++) { ayudante[i][0] = lista.get(i).getCiudadResidencia(); ayudante[i][1] = Math.round(lista.get(i).getSalarioPromedio()); String ciudad = lista.get(i).getCiudadResidencia(); double promedio = Math.round(lista.get(i).getSalarioPromedio()); Object[] datos = {ciudad, promedio}; //modelo.addRow(datos); } modelo = new DefaultTableModel(ayudante, nombresColumnas); return modelo; } }
内容的提问来源于stack exchange,提问作者Juan Felipe Jaramillo Losada
相关产品推荐
相关产品推荐

