【问题标题】:item from arrayList deletes from panel but not from actual arrayList?arrayList 中的项目从面板中删除,但不是从实际的arrayList 中删除?
【发布时间】:2015-12-17 10:14:31
【问题描述】:

之前我写了一个程序,它会添加用户,然后在用户名旁边制作一个带有复选框的列表,然后您可以从中进行选择,然后按删除按钮删除用户名以及旁边的复选框。 现在在构建和组合我的实际程序之后,我意识到名称实际上并没有从实际列表中删除,而只是从面板中删除(因此它只是变得不可见)。我怎样才能使它真正从数组列表中删除,而不仅仅是从面板中删除?还有没有办法让它不接受相同的用户名?

我的完整程序代码在这里:GITHUB

在这里,当我运行 MenuWindow 并单击 Manage Users 时,我的 ManageUsersGUI 窗口会弹出,它允许我添加和删除用户。当我关闭它并按下查看可用杂务时,它会打开另一个窗口,在该窗口中它允许我查看用户的杂务,我可以从 JComboBox 中选择。但它显示了所有相同的重复名称和我删除的名称。如果我返回并按下“管理用户”按钮,窗口会再次弹出,并且没有以前的用户列表。它又是空的,如果您添加相同的名称,它将允许您再次添加,当您删除时它实际上并没有删除。

这是我的 ManageUsersGUI 代码:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import javax.swing.JCheckBox;

public class ManageUsersGUI extends JFrame {
    public ArrayList<User> users;
    private JLabel title;
    private JLabel addNewUserLabel;
    private JTextField addNewUserTextField;
    private JLabel deleteUsersLabel;
    private JButton addButton;
    private JButton deleteButton;
    private JPanel namePanel;
    final int WINDOW_WIDTH = 500;
    final int WINDOW_HEIGHT = 400;


    public ManageUsersGUI() {
        setSize(WINDOW_WIDTH, WINDOW_HEIGHT);

        //construct components
        title = new JLabel ("Manage Users");
        title.setFont(new Font("Serif", Font.PLAIN, 28));

        addNewUserLabel = new JLabel ("Add new User here:");
        addNewUserTextField = new JTextField (0);
        deleteUsersLabel = new JLabel ("Select which User(s) you would like to delete:");
        addButton = new JButton ("Add");
        deleteButton = new JButton ("Delete");
        namePanel = new JPanel();
        namePanel.setLayout(new BoxLayout(namePanel, BoxLayout.Y_AXIS));

        //set components properties
        addNewUserTextField.setToolTipText ("Enter name and click on Add button.");
        addButton.setToolTipText ("Click here to Add new user.");
        deleteButton.setToolTipText ("Click here to delete User(s) selected.");

        //adjust size and set layout
        setPreferredSize (new Dimension (500, 600));
        setLayout (null);

        //add components
        add (title);
        add (addNewUserLabel);
        add (addNewUserTextField);
        add (deleteUsersLabel);
        add (namePanel);
        add (addButton);
        add (deleteButton);

        //set component bounds (only needed by Absolute Positioning)
        title.setBounds (170, 10, 300, 100);
        addNewUserLabel.setBounds (65, 90, 120, 25);
        addNewUserTextField.setBounds (200, 90, 125, 25);
        deleteUsersLabel.setBounds (135, 120, 281, 25);
        addButton.setBounds (350, 90, 90, 25);
        namePanel.setBounds(225, 270, 140, 0);
        deleteButton.setBounds (200, 300, 100, 25);

        addButton.addActionListener(new AddButtonListener());

        deleteButton.addActionListener(new DeleteButtonListener());

        setVisible(true);
    }      

    private class AddButtonListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            String text = addNewUserTextField.getText();
            ChoreScoreData.getUserList().add(new User(text));

            // Display the changes.
            JOptionPane.showMessageDialog(null, text + " has been added.");

            JCheckBox nameCheckBox = new JCheckBox();
            nameCheckBox.setText(addNewUserTextField.getText());
            namePanel.add(nameCheckBox);
            namePanel.setBounds(225, 140, 140, namePanel.getHeight() + 25);
            deleteButton.setBounds(200, deleteButton.getY() + 25, 100, 25);
            JFrame frame = (JFrame) getRootPane().getParent();
            frame.setSize(frame.getWidth(), frame.getHeight() + 25);
            frame.pack(); 
        }
    }

    private class DeleteButtonListener implements ActionListener {
         @Override
         public void actionPerformed(ActionEvent e) {
            for(Component component : namePanel.getComponents()) {
               if(component instanceof JCheckBox) {
                  if(((JCheckBox)component).isSelected())
                     namePanel.remove(component);
                     for (User user: users) {
                       users.remove(user);
                     }
            }
            namePanel.revalidate();
            namePanel.repaint();
         }   
    }

    public static void main (String[] args) {
        JFrame frame = new JFrame ("AddUsersPanel1");
        frame.setTitle("Manage Users");
        frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add (new ManageUsersGUI());
        frame.pack();
        frame.setVisible (true);
    }
}

UPDATE#2:添加了从arrayList中删除的代码

 private class DeleteButtonListener implements ActionListener {
     @Override
     public void actionPerformed(ActionEvent e) {
        for(Component component : namePanel.getComponents()) {
           if(component instanceof JCheckBox) {
              if(((JCheckBox)component).isSelected())
                 namePanel.remove(component);
                 for (Iterator it = users.iterator(); it.hasNext();) {
                     it.next();
                     it.remove();
                 }           
           }
        }
        namePanel.revalidate();
        namePanel.repaint();
     }   
}

现在给我这个长错误:

         ----jGRASP exec: java MenuWindow

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at ManageUsersGUI$DeleteButtonListener.actionPerformed(ManageUsersGUI.java:96)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2346)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:289)
    at java.awt.Component.processMouseEvent(Component.java:6525)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3322)
    at java.awt.Component.processEvent(Component.java:6290)
    at java.awt.Container.processEvent(Container.java:2234)
    at java.awt.Component.dispatchEventImpl(Component.java:4881)
    at java.awt.Container.dispatchEventImpl(Container.java:2292)
    at java.awt.Component.dispatchEvent(Component.java:4703)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4898)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4533)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4462)
    at java.awt.Container.dispatchEventImpl(Container.java:2278)
    at java.awt.Window.dispatchEventImpl(Window.java:2739)
    at java.awt.Component.dispatchEvent(Component.java:4703)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:751)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:702)
    at java.awt.EventQueue$3.run(EventQueue.java:696)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
    at java.awt.EventQueue$4.run(EventQueue.java:724)
    at java.awt.EventQueue$4.run(EventQueue.java:722)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:721)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

 ----jGRASP: operation complete.

【问题讨论】:

  • 我看不到您从数组列表中实际删除用户的代码。类似users.remove(index)
  • 第 95 行对应的是哪一行? (您的 ManageUsersGUI.java
  • @Sparta for (User user: users) {

标签: java arraylist jcombobox


【解决方案1】:

没有从arraylist 中删除任何内容,因为您没有从arralist 中删除任何内容。我可以看到您正在从 swing 组件中删除组件,但从未从 arraylist 中删除

编辑:您发布了从数组列表中删除的代码,您正在从您正在迭代的集合中删除,这总是坏消息。 您应该使用迭代器,如下所示:

for (Iterator it = users.iterator(); it.hasNext();) {
    it.next();
    it.remove();
}

再次编辑:既然您似乎要从数组列表中删除所有内容,为什么不简单地使用

users.clear();

?

【讨论】:

  • 这可以编译,但是当我在我的 GitHub 中运行我的第 3 段中描述的实际整个程序时,我得到了同样的错误。以上更新。
  • 您发布的代码编译了吗?可以,但您不能从基础集合中删除增强 for 循环中的元素
  • 抱歉,在我发布更新之前你回答得太快了。
  • @pyuntae 您可以通过比较您感兴趣的字段来手动编写它,或者如果使用 IDE,它将允许您生成它。对于用户对象,它可以是@Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; User other = (User) obj; if (userName == null) { if (other.userName != null) return false; } else if (!userName.equals(other.userName)) return false; return true; }。请参阅 dbrown93 观察 - 将用户添加到“ChoreSetData”中的列表并在不同列表中删除
  • @pyuntae 这是因为用户对象从未在 ManageUsersGUI 类中初始化。检查 DeleteButtonListener 类,如果意图是删除选定的用户,我认为您应该将for (Iterator it = users.iterator(); it.hasNext();) { it.next(); it.remove(); } 替换为ChoreScoreData.getUserList().remove(new User(((JCheckBox)component).getText()));
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-29
  • 1970-01-01
  • 2018-03-31
  • 2023-03-15
  • 2013-08-31
  • 2023-04-07
相关资源
最近更新 更多