【发布时间】: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) {