Search code examples
javajbuttonactionlistener

How to make deleteAction to delete button in JPanel of other JPanel?


I have a private JPanel :

private JPanel bigPanel;

Inside the bigPanel, I have another ten JPanel(panel_1D, panel_2D...). Each of them have a few buttons. Those buttons are added with deleteAction actionListener:

JPanel panel_1D = new JPanel();//Panel ONE

GridBagConstraints gbc_panel_1D = new GridBagConstraints();...
bigPanel.add(panel_1D, gbc_panel_1D);
GridBagLayout gbl_panel_1D = new GridBagLayout();...
panel_1D.setLayout(gbl_panel_1D);

          JButton button_2 = new JButton("ECG");
          GridBagConstraints gbc_button_2 = new GridBagConstraints();...
          button_2.addActionListener(deleteAction); 
          panel_1D.add(button_2, gbc_button_2);
          ...

I created a DELETE button in other panel(outside of the bigPanel):

JButton button_38 = new JButton("DELETE");
button_38.addActionListener(new ActionListener() {
       public void actionPerformed(ActionEvent arg0) {
         JOptionPane.showMessageDialog(null, "Delete any task by clicking it." , "INFO : 
", JOptionPane.INFORMATION_MESSAGE);    
deleteNow = true;  
//allowOpen =false;             }
});

Then I set up deleteAction method:

private ActionListener deleteAction = new ActionListener()
    {
        public void actionPerformed(ActionEvent ae)
        {
            JButton button = (JButton) ae.getSource();
            if (deleteNow)
            {   //allowOpen=false;
                bigPanel.remove(button);
                bigPanel.revalidate();
                bigPanel.repaint();
                deleteNow = false;

            }
            else
            {
              System.out.println("My COMMAND IS : " + button.getActionCommand());
            }
        }
    };

Currently, if I RUN, I will click DELETE button. Then, a pop up message "Delete any task by clicking it." shown. So when I closed the pop up message, I clicked the button that I want to delete. Unfortunately, the button I clicked did not deleted.

UPDATE: After I change

bigPanel.remove(button);
bigPanel.revalidate();
bigPanel.repaint(); 

to

button.getParent().remove(button);
button.getParent().revalidate();
button.getParent().repaint();

I got warning in console :

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at UI2$1.actionPerformed(UI2.java:128)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

Solution

  • You need to call remove() on a container which contains coponent you want to remove, so instead:

    bigPanel.remove(button);
    

    you should call for example:

    panel1_D.remove(button);
    

    Because buttons are not in bigPanel directly (but in sub-panel). However, if you have a multiple panels with multiple buttons, the better solution would be:

    button.getParent().remove(button);
    

    getParent() method returns parent container for given component, so it should work with every button and you don't need to create methods for every group of buttons in different panels.