删除后JList项目会回来吗?

时间:2014-03-07 19:23:52

标签: java swing jlist

我正在创建一个带有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());
        }
    });

}
}

2 个答案:

答案 0 :(得分:3)

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

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

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

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

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

答案 1 :(得分:2)

在您的添加侦听器中,您从ListModel重新填充ListArray,但在删除时,您只删除ListModel中的元素,而不是之后使用的ListArray中的元素

严格来说,ListArray是多余的。只需直接使用ListModel即可。如果你不能这样做,重构将模型重新填充到自己的方法中,并在操作ListArray之后从两个侦听器调用它