You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么我的JTable中的数据仅在选中对应行后才可见?

JTable初始为空、选中后才显示内容的原因及解决方案

问题现象

实现的JTable数据来源于字符串集合,运行程序后默认显示为空,只有选中对应行后才会完整展示所有数据:

  • 运行初始效果:
    运行后截图
  • 选中行后效果:
    选中后截图

核心问题原因

代码存在两处关键错误,共同导致了渲染异常:

  1. JScrollPane添加JTable的方式错误:Swing的JScrollPane有独立的视口(Viewport)管理机制,不能直接调用add()方法添加子组件,你写的scrollPane.add(tabla)实际上没有把表格放到滚动面板的渲染视口中,初始状态下表格内容不会被自动绘制,只有选中时触发单元格强制重绘才会显示内容。
  2. 额外问题:你使用了绝对布局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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 12:30:05