gpt4 book ai didi

java - 当我选择第一行时,为什么我的 JTable 重绘会发生堆栈溢出?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:13:58 25 4
gpt4 key购买 nike

所以我正在尝试用 swing 编写一个 UI。简而言之,我有一个 JTable,我可以在其中监听选择事件,在用户选择一个项目后,代码会在程序代码中走一段路,然后调用一个表“重绘”;它清空表,并再次添加行。

这个过程对于点击第 2-4 行似乎工作正常(见下面的代码位),但是当我点击第一行时,我得到一个无法解释的堆栈溢出。

我知道这不是最好的解决方案,因为表格实际上不需要重绘,但我首先要保持代码的整洁和逻辑结构(这就是导致重绘的原因),其次长期以来,我一直在努力找出导致这种情况的原因,以至于我真的很想知道会发生什么。

这是一个可重现问题的可运行类:

import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableModel;

public class Tester implements ListSelectionListener {
private DefaultTableModel model;

public Tester(DefaultTableModel model) {
this.model = model;
}

public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setSize(200, 200);
frame.setVisible(true);

JTable table = new JTable();
DefaultTableModel model = new DefaultTableModel();
table.setModel(model);
table.getSelectionModel().addListSelectionListener(new Tester(model));
model.setColumnCount(3);
model.setColumnIdentifiers(new String[]{"col1", "col2", "col3"});
frame.add(table);

model.addRow(new Object[]{"1", "2", "3"});
model.addRow(new Object[]{"4", "2", "3"});
model.addRow(new Object[]{"3", "2", "3"});
model.addRow(new Object[]{"2", "2", "3"});
}

public void valueChanged(ListSelectionEvent event) {
model.setRowCount(0);
model.addRow(new Object[]{"1", "2", "3"});
model.addRow(new Object[]{"4", "2", "3"});
model.addRow(new Object[]{"3", "2", "3"});
model.addRow(new Object[]{"2", "2", "3"});
}
}

最佳答案

stackoverflow 的原因是,当您删除所有行并开始添加行时,您会再次触发监听器。我不太喜欢在选择监听器中更改模型(想想另一个选择监听器附加到表的情况......它将收到完全搞砸的事件。可能的解决方案是至少使用 invokeLater 调用)。

但是为了避免你的 stackoverflow 异常,使用

  @Override
public void valueChanged(ListSelectionEvent event) {
ListSelectionModel listSelectionModel = ( ListSelectionModel ) event.getSource();
listSelectionModel.removeListSelectionListener( this );
model.setRowCount(0);
model.addRow(new Object[]{"1", "2", "3"});
model.addRow(new Object[]{"4", "2", "3"});
model.addRow(new Object[]{"3", "2", "3"});
model.addRow(new Object[]{"2", "2", "3"});
listSelectionModel.addListSelectionListener( this );
}

关于java - 当我选择第一行时,为什么我的 JTable 重绘会发生堆栈溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9836768/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com