Как я могу получить кнопку удаления, чтобы фактически удалить имя и флажок рядом с ним?

Я пытаюсь заставить свою программу для пользователя установить флажок с именем рядом с ним и затем иметь возможность удалить всю строку (из arrayList) при нажатии кнопки удаления. Моя программа будет выглядеть примерно так:

Вот мой код:

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

public class ManageUsersGUI1 extends JPanel {
    public static ArrayList<AddUsers> users = new ArrayList<>();

    private JLabel addNewUserLabel;
    private JTextField addNewUserTextField;
    private JLabel deleteUsersLabel;
    private JButton addButton;
    private JButton deleteButton;
    private JPanel namePanel;

    public ManageUsersGUI1() {
        //construct components
        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 (580, 485));
        setLayout (null);

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

        //set component bounds (only needed by Absolute Positioning)
        addNewUserLabel.setBounds (85, 130, 120, 25);
        addNewUserTextField.setBounds (235, 130, 125, 25);
        deleteUsersLabel.setBounds (135, 225, 281, 25);
        addButton.setBounds (385, 130, 100, 25);
        namePanel.setBounds(225, 270, 140, 0);
        deleteButton.setBounds (230, 335, 100, 25);

        addButton.addActionListener(new AddButtonListener());

        deleteButton.addActionListener(new DeleteButtonListener());


    }

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

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

            JCheckBox nameCheckBox = new JCheckBox();
            nameCheckBox.setText(addNewUserTextField.getText());
            namePanel.add(nameCheckBox);
            namePanel.setBounds(225, 270, 140, namePanel.getHeight() + 25);
            deleteButton.setBounds(230, 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) {
            ///STUCK HERE///   
         }
    }      


    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 ManageUsersGUI1());
        frame.pack();
        frame.setVisible (true);
    }
}

Код AddUsers:

public class AddUsers{

   private String userName;

   public AddUsers(String userName) {
      this.userName = userName;
   }

   public AddUsers() {
      userName = "";
   }   

   public void setUserName(String userName) {
      this.userName = userName;   
   }

   public String getUserName() {
      return userName;
   }

   public String toString() {
      return userName + "\n";
   }

}     

2 ответа

Решение

В псевдокоде

  1. Переберите всех детей, чтобы получить ссылку на одного ребенка за раз
  2. Проверьте, является ли ребенок экземпляром JCheckBox
  3. Если да, подтвердите флажок, ребенок отмечен (отмечен)
  4. Если да, вызовите namePanel.remove(child);
  5. Когда вы закончите удаление всех подходящих детей, позвоните revalidate(); а также repaint(); (в таком порядке) на панели имен, чтобы убедиться, что пользовательский интерфейс обновляется должным образом

Вот мой законченный код:

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);
           }
        }
        namePanel.revalidate();
        namePanel.repaint();
     }   
}

Если вы можете успешно добавить JComponents на экран, то следующее должно помочь:

 add(myComponent);
 //your component should be there, if not you may call 
 /*repaint()*/
 //then when you want to remove, call
 remove(myComponent);
 //remember that you need to actually properly set the text for the JComboBox items.
Другие вопросы по тегам