Удалить определенную кнопку - PullRequest
2 голосов
/ 22 марта 2012

У меня есть JPanel в JFrame, который содержит 5 кнопок.В другом JPanel есть кнопка, которая называется «кнопка удаления», и я хочу нажать на эту кнопку и затем выбрать, какую кнопку из других 5 удалить, нажав на одну из них.Кто-нибудь может мне помочь?

    public class gui extends JFrame implements ActionListener
    {
      JPanel p1 = new JPanel();
      JPanel p2 = new JPanel();
      JPanel p2 = new JPanel();

      JButton b1 = new JButton("Delete");
      JButton b2 = new JButton("A");
      JButton b3 = new JButton("B");
      JButton b4 = new JButton("C");

      gui()
      {
        p1.setLayout(new GridLayout(1,2));
        p1.add(p2);
        p1.add(p3);

        p2.setLayout(new GridLayout(3,1));
        p2.add(b2);
        p2.add(b3);
        p2.add(b4);
        p3.add(b1);

        b1.addActionListener(this);
        b2.addActionListener(this);
        b3.addActionListener(this);
        b4.addActionListener(this);

      }

     public void actionPerformed(ActionEvent e)
     {
       if (e.getSource() == b1)
         // When I click this button I want to be able to delete a button of my choice (one of the other 3)
     }
   }

Ответы [ 4 ]

5 голосов
/ 22 марта 2012

Используйте цепочку ответственности в кнопке слушателей. Слушатель One Button, который прослушивает кнопки «быть удаленными» и кнопку «удалить». При нормальной работе этот слушатель кнопки просто отправляет события кнопки «быть удаленными» существующим событиям кнопки, но когда он слышит событие кнопки «удалить», он затем захватывает событие «следующей» кнопки, не отправляя его существующему слушателю кнопки и действует для удаления кнопки.

Хорошо, вы предоставили код. Вот решение, которое использует цепочку ответственности. По сути, если один ActionListener не может обработать событие, он отправляет его следующему и т. Д.

import java.awt.GridLayou;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;

public class Gui extends JFrame {

  public static final long serialVersionUID = 1L;

  JPanel p1 = new JPanel();
  JPanel p2 = new JPanel();
  JPanel p3 = new JPanel();

  JButton b1 = new JButton("Delete");
  JButton b2 = new JButton("A");
  JButton b3 = new JButton("B");
  JButton b4 = new JButton("C");

  public Gui() {

    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

    p1.setLayout(new GridLayout(1, 2));
    p1.add(p2);
    p2.add(p3);

    p2.setLayout(new GridLayout(3, 1));
    p2.add(b2);
    p2.add(b3);
    p2.add(b4);

    p3.add(b1);

    DoItListener doIt = new DoItListener(null);
    DeleteItListener deleteIt = new DeleteItListener(this, doIt);

    b1.addActionListener(deleteIt);
    b2.addActionListener(deleteIt);
    b3.addActionListener(deleteIt);
    b4.addActionListener(deleteIt);

    add(p1);
    pack();
  }

  public void deleteButton(String name) {
    if (b2 != null && "A".equals(name)) {
      p2.remove(b2);
      b2 = null;
      p2.invalidate();
      p2.redraw();
    }
    if (b3 != null && "B".equals(name)) {
      p2.remove(b3);
      b3 = null;
      p2.invalidate();
      p2.redraw();
    }
    if (b4 != null && "A".equals(name)) {
      p2.remove(b4);
      b4 = null;
      p2.invalidate();
      p2.redraw();
    }
  }

  public static void main(String[] args) {
    java.awt.EventQueue.invokeLater(new Runnable() {
      public void run() {
        new Gui().setVisible(true);
      }
    });
  }
}

class DoItListener implements ActionListener {

  private ActionListener delegate;

  public DoItListener(ActionListener next) {
    delegate = next;
  }

  public void actionPerformed(ActionEvent e) {
    if (!("Delete".equals(e.getActionCommand()))) {
      System.out.println("doing " + e.getActionCommand());
    } else if (delegate != null) {
      delegate.actionPerformed(e);
    }
  }
}

class DeleteItListener implements ActionListener {

  private Gui gui;

  private boolean deleteNext;

  private ActionListener delegate;

  public DeleteItListener(Gui container, ActionListener next) {
    gui = container;
    delegate = next;
    deleteNext = false;
  }

  public void actionPerformed(ActionEvent e) {
    if ("Delete".equals(e.getActionCommand())) {
      deleteNext = true;
    } else if (deleteNext) {
      gui.deleteButton(e.getActionCommand());
      deleteNext = false;
    } else if (delegate != null) {
      delegate.actionPerformed(e);
    }
  }
}
2 голосов
/ 22 марта 2012

Вот попробуйте этот код:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class DeleteButtonExample extends JFrame
{
    private boolean deleteNow = false;
    private JButton deleteButton;
    private JPanel leftPanel;
    private JPanel rightPanel;
    private JButton[] buttons = new JButton[5];

    private ActionListener deleteAction = new ActionListener()
    {
        public void actionPerformed(ActionEvent ae)
        {
            JButton button = (JButton) ae.getSource();
            if (deleteNow)
            {
                leftPanel.remove(button);
                leftPanel.revalidate();
                leftPanel.repaint();
                deleteNow = false;
            }
            else
            {
                // Do your normal Event Handling here.
                System.out.println("My COMMAND IS : " + button.getActionCommand());
            }
        }
    };

    private void createAndDisplayGUI()
    {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationByPlatform(true);
        setLayout(new GridLayout(0, 2));

        leftPanel = new JPanel();
        leftPanel.setLayout(new GridLayout(0, 2));
        leftPanel.setBackground(Color.WHITE);
        for (int i = 0; i < 5; i++)
        {
            buttons[i] = new JButton("" + i);
            buttons[i].addActionListener(deleteAction);
            buttons[i].setActionCommand("" + i);
            leftPanel.add(buttons[i]);
        }

        rightPanel = new JPanel();
        rightPanel.setBackground(Color.BLUE);

        JButton deleteButton = new JButton("DELETE");
        deleteButton.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent ae)
            {
                JOptionPane.showMessageDialog(null, "Delete any Button from the Left Panel by clicking it."
                                                                                    , "INFO : ", JOptionPane.INFORMATION_MESSAGE);
                deleteNow = true;                                                                   
            }
        });
        rightPanel.add(deleteButton);

        add(leftPanel);
        add(rightPanel);
        pack();
        setVisible(true);
    }

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new DeleteButtonExample().createAndDisplayGUI();
            }
        });
    }
}

ВЫХОД:

FIRST WINDOW, WHEN YOU CLICKED DELETE BUTTON, AFTER YOU CLICK THE BUTTON ON LEFT PANEL IT WILL BE DELETED AS SHOWN HERE

2 голосов
/ 22 марта 2012

Вот фрагмент кода, который поможет вам в правильном направлении:

import java.awt.event.ActionEvent;
import javax.swing.*;

public class FrameTestBase extends JFrame {

    public static void main(String args[]) {
        FrameTestBase t = new FrameTestBase();

        final JPanel p = new JPanel();

        final JButton button = new JButton();

        button.setAction(new AbstractAction("Remove me!") {
            @Override
            public void actionPerformed(ActionEvent e) {
                p.remove(button);
                p.revalidate();
                p.repaint();
            }
        });

        p.add(button);
        t.setContentPane(p);

        t.setDefaultCloseOperation(EXIT_ON_CLOSE);
        t.setSize(400, 400);
        t.setVisible(true);
    }
}

Перед нажатием:

enter image description here

После нажатия:

enter image description here


Из комментариев:

Для обобщения этого вы можете создать AbstractAction, который принимаетУдалить кнопку в качестве аргумента.Используйте это AbstractAction и обновляйте его по мере необходимости, когда ваша политика удаления должна измениться.

1 голос
/ 22 марта 2012

Посмотрите на стекло.Этот учебник показывает, как он используется.

На высоком уровне нажатие кнопки «Удалить» переведет слушателя стеклянной панели в состояние, в котором он:

  1. обнаруживает щелчок,
  2. определяет целевой компонент,
  3. определяет, разрешено ли удаление компонента
  4. и, если это так, удаляет компонент.

В качестве примечания по проектированию я бы оставил Set элементов управления, которые можно удалять, и тем самым разделил бы проблемы.Поэтому, когда вы добавляете кнопку, которую можно удалить, вы также обязаны добавить ее в набор кандидатов для удаления.

...