撇开项目背景不谈,我已经实现了一个自定义 JComboBox 表格。每行 ComboBox 都是唯一的:虽然每个 ComboBox 都有自己的模型(以允许不同的选择),但每个选项每行只能选择一次。这是通过在选择项目时将标签添加到项目的前面并在取消选择时再次将其删除来完成的。如果用户尝试选择标记的项目,则不会发生任何事情。
但是,这只在使用 Vector 作为选项列表的支持时才有效。我可以获取字符串 vector ,使用 set() 或 setElementAt(),然后就可以了。
但是,使用 ArrayList 而不是 Vector,这根本不起作用。我的印象是 ArrayList 的功能类似,因为我可以检索匿名 ArrayList,更改其内容,并且依赖该 ArrayList 内容的所有其他对象将相应更新,就像 Vector 实现一样。
我希望有人能告诉我为什么这是不同的,因为 Vector 和 ArrayList 都实现 List 并且应该具有类似的行为。
编辑:
感谢您的及时回复!所有答案都涉及 ArrayList 和 Vector 之间的同步差异。但是,我的项目没有显式创建新线程。这是否可能是我的数据和 Swing 线程之间的同步问题?我对线程的了解不够好……
第二次编辑:
再次感谢大家!数据和 Swing 之间的同步很容易回答我的问题,但如果还有更多细节,我仍然对更多细节感兴趣。
最佳答案
我怀疑差异是由于 Vector
是线程安全的,而 ArrayList
不是。这会影响其元素更改对不同线程的可见性。当您更改 Vector
中的元素时,其他线程会立即看到该更改。 (这是因为它的方法是使用锁进行同步的,这会创建一个内存屏障,有效地将线程内存的当前状态(包括其中的最新更改)与其他线程的内存状态同步。)但是,使用 ArrayList 时,这种同步不会自动发生,因此一个线程所做的更改可能稍后才对其他线程可见(并且以任意顺序),或者根本不可见。
由于 Swing 本质上是多线程的,因此您需要确保数据更改在不同(工作线程、UI)线程之间可见。
关于java - Vector.set() 和 ArrayList.set() 中不同行为的说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6918775/