gpt4 book ai didi

java - 当我在选择 0 索引的情况下删除和添加时,Swing JList 卡住

转载 作者:行者123 更新时间:2023-12-02 11:22:16 28 4
gpt4 key购买 nike

这是一个示例,您按下一个按钮,jList1 就会重新填充从 a1 到 a1000 的项目。:

//variable
private List<String> list = new ArrayList<>();

...

//main method
jList1.setModel(new DefaultListModel());
for(int i = 0; i < 1000; i++) {
list.add("a"+i);
}

...

//button action - jList1 refill
DefaultListModel dtm = (DefaultListModel)jList1.getModel();
dtm.removeAllElements();
for(String s : list) {
dtm.addElement(s);
}

如果我填充jList1,然后(用鼠标)选择0索引(jList中的第一个元素),然后按下按钮,程序会在重新填充列表时卡住。如果我选择任何其他元素或根本不选择列表中的任何项目,那么它就可以填充。

附注这个示例是在没有任何 swing 或 EWT 线程的情况下完成的,因为主要原因是使用它们。

SSCCE:

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package lt;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;

/**
*
* @author Minutis
*/
public class Window {

public static void main(String[] args) {
final List<String> list = new ArrayList<>();


JFrame frame = new JFrame("BorderLayout Frame");
JPanel panel = new JPanel();
final JList jList1 = new JList();
JButton refill = new JButton("Refill");

jList1.setModel(new DefaultListModel());
for(int i = 0; i < 1000; i++) {
list.add("a"+i);
}

refill.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
DefaultListModel dtm = (DefaultListModel)jList1.getModel();
dtm.removeAllElements();
for(String s : list) {
dtm.addElement(s);
}
}

});

frame.add(panel);
panel.setLayout(new BorderLayout());
panel.add(jList1, BorderLayout.CENTER);
panel.add(refill, BorderLayout.SOUTH);
frame.setSize(300, 300);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}

最佳答案

该问题是由于选择第一个元素时删除模型中的所有元素而引起的。它的实现方式是,当选择并删除索引时,由于某种原因它会生成 SelectionChanged 事件。如果在删除另一个索引时选择了另一个索引(即使这意味着元素移位),它也不会生成 SelectionChanged 事件。

删除的实现方式是定期删除第一个元素,同时选择索引保持不变。因此,对于选择索引 0 的情况,它会生成 1000 个 SelectionChanged 事件,这些事件必须由 EDT 和监听器处理。如果选择另一个索引,则仅生成 1 个事件。这大大减少了开销。

在选择索引 0 的情况下重新填充之前,尝试手动将选择设置为索引 1:

if(jList1.getSelectedIndex() == 0){
jList1.setSelectedIndex(1);
}

我认为如果列表中只有一个元素,则无需担心 - 它不应该执行任何操作来将索引设置为大于元素计数。但这可能是特定于实现的。

出于某种原因,clearSelection() 将导致生成 selectChanged 事件以重新填充空列表。

关于java - 当我在选择 0 索引的情况下删除和添加时,Swing JList 卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13494352/

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