gpt4 book ai didi

java - JList 项目删除后回来?

转载 作者:行者123 更新时间:2023-11-29 07:49:42 26 4
gpt4 key购买 nike

我正在创建一个带有 JTextField 和 2 个 JButton(添加/删除)的 JList。一旦我点击删除按钮,它就会删除,但一旦我将另一个项目输入到列表中就会返回。我不知道我是否搞砸了,但这是代码:

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.DefaultListModel;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.JList;
import javax.swing.border.LineBorder;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;


public class i extends JFrame {

private JPanel contentPane;
private JTextField jTextField;
private DefaultListModel ListModel = new DefaultListModel();
private ArrayList<String> ListArray = new ArrayList <String>();
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
i frame = new i();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

/**
* Create the frame.
*/
public i() {


setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);

jTextField = new JTextField();
jTextField.setBounds(15, 80, 168, 20);
contentPane.add(jTextField);
jTextField.setColumns(10);

JButton jButton = new JButton("Add");
jButton.setBounds(193, 79, 89, 23);
contentPane.add(jButton);
jButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
if(!jTextField.getText().equals("")){
ListModel.clear();
ListArray.add(jTextField.getText());
jTextField.setText("");
for (int i=0; i<ListArray.size(); i++){
ListModel.add(i, ListArray.get(i));
}
}
}
});

final JList jList = new JList(ListModel);
jList.setBorder(new LineBorder(new Color(0, 0, 0)));
jList.setBounds(289, 11, 135, 240);
contentPane.add(jList);

JButton delete = new JButton("DELETE");
delete.setBounds(193, 161, 89, 23);
contentPane.add(delete);
delete.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent k){
ListModel.removeElement(jList.getSelectedValue());
}
});

}
}

最佳答案

您正在从 JList 中删除该元素,但并未将其从您的数组中删除。您的添加按钮从数组中重新填充 JList,因此所有项目都被重新添加。

您必须将其从数据数组中删除。

保持整洁的一种方法是制作一个清除列表然后从数组中重新填充它的方法。然后您可以只对数组进行所有修改并调用该方法来更新列表,而无需在任何地方重复该逻辑。

Silly Freak splungebob 也提出了一个很好的观点;您可以将所有项目存储在DefaultListModel 中并完全删除数组。在更复杂的应用程序中,您可能会实现自己的 ListModel,它反射(reflect)您存储对象的任何数据结构。对于您的应用程序,只需使用 DefaultListModel 作为存储容器不过会很好,并且会稍微简化您的代码(并且会自动更新 JList,而无需您清除和重新填充)。

顺便说一下,传统的 Java 命名约定是变量名以小写字母开头。其他程序员可能很难阅读您的代码,因为大写的名称通常是为类名保留的(您甚至可以看到 SO 的语法高亮显示有点困惑)。

关于java - JList 项目删除后回来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22258935/

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