我正在创建一个带有JTextField和2个JButtons(添加/删除)的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());
}
});
}
}
答案 0 :(得分:3)
您正在从JList
中删除该元素,但您并未将其从阵列中删除。您的添加按钮会从数组中重新填充JList
,因此会重新添加所有项目。
您必须将其从数据阵列中删除。
保持整洁的一种方法是制作一个清除列表的方法,然后从数组中重新填充它。然后你可以对数组进行所有修改并调用该方法来更新列表,而不是在任何地方重复该逻辑。
Silly Freak和splungebob也提出了一个好点;你可以存储DefaultListModel
中的所有项目并完全删除数组。在更复杂的应用程序中,您可以实现自己的ListModel
,它反映了您存储对象的任何数据结构。对于您的应用程序,只使用DefaultListModel
作为存储容器就可以了。并会稍微简化您的代码(并且会自动更新JList
,而无需清除和重新填充)。
顺便说一下,传统的Java命名约定是用小写字母开始变量名。其他程序员可能很难读取你的代码,因为大写名称通常是为类名保留的(你甚至可以看到SO的语法高亮显示有点混乱)。
答案 1 :(得分:2)
在您的添加侦听器中,您从ListModel
重新填充ListArray
,但在删除时,您只删除ListModel
中的元素,而不是之后使用的ListArray
中的元素
严格来说,ListArray
是多余的。只需直接使用ListModel
即可。如果你不能这样做,重构将模型重新填充到自己的方法中,并在操作ListArray
之后从两个侦听器调用它