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

Java Swing JFrame添加对象到ArrayList更新JList出现旧条目被覆盖问题

问题根因

  • 你在Formulario类中将cliente1声明为全局成员变量,整个类的生命周期内只会创建这一个Cliente实例。Java中对象是引用传递,你每次往arregloClientes中添加的都是同一个对象的内存引用,后续修改这个对象的属性时,列表中所有指向该地址的记录都会同步变更,所以看起来是旧记录被新内容覆盖了。
  • Main类的窗口初始化逻辑存在错误:你先实例化了一次Formulario frame1 = new Formulario(),调用setContentPane时又新建了另一个Formulario实例,两个实例互相独立,事件监听绑定在第二个实例的组件上,窗口显示的面板和实际绑定逻辑的实例不匹配,也会引发异常。

修复方案

1. 调整新增记录的实例创建逻辑

删除Formulario类中全局声明的Cliente cliente1 = new Cliente("","","","");代码,在添加按钮的点击事件中,每次新增都创建新的Cliente实例再加入列表,修改后的监听逻辑如下:

btAgregarRegistro.addActionListener(new ActionListener()
{
    @Override
    public void actionPerformed(ActionEvent e)
    {
        // 每次新增记录都创建独立的Cliente实例
        Cliente nuevoCliente = new Cliente(
            txNombre.getText(),
            txApellido.getText(),
            txEmail.getText(),
            txTelefono.getText()
        );
        arregloClientes.add(nuevoCliente);
        actualizarLista();
        blanquearCampos();
    }
});

2. 修复主类的窗口初始化逻辑

不要重复创建Formulario实例,同时替换已经被标记为过时的show()方法:

public static void Formulario1()
{
    Formulario frame1 = new Formulario();
    frame1.setContentPane(frame1.getPanel()); // 复用同一个实例的面板
    frame1.setSize(800,600);
    frame1.setLocation(600,230);
    frame1.setVisible(true); // 替代过时的show()方法
}

3. 可选优化项

  • 给DefaultListModel添加泛型约束,避免类型转换异常:DefaultListModel<String> datos = new DefaultListModel<>();
  • 删除操作前先判断是否有选中的条目,避免索引越界:
@Override
public void actionPerformed(ActionEvent e)
{
    int indice = listClientes.getSelectedIndex();
    if(indice != -1) { // 仅当有选中条目时执行删除
        arregloClientes.remove(indice);
        actualizarLista();
    }
}

内容的提问来源于stack exchange,提问作者user17242718

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 14:54:03