java - 删除特定按钮

标签 java swing jpanel jbutton actionlistener

我在 JFrame 中有一个 JPanel,其中包含 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)
     }
   }

最佳答案

在按钮监听器中使用责任链。 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);
    }
  }
}

关于java - 删除特定按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9827517/

相关文章:

java - JTextArea 的 Apache DefaultExecutor 和 Ping 命令

java - 在单个 JFrame 中使用多个 JPanel

java - 如何调整 JPanel 的大小以适应 "docknorth"中的 JFrame 而不会干扰剩余的 JPanel

java - Interleave - 在 Java 中不能正常工作

Java:消除关于导致连接重置的原因的困惑

java - 当我向下滚动时,侧面菜单变成白色

java - SpringLayout 适用于 Windows 7 但不适用于 NetBSD?

java - 如何在 Java (NetBeans) 中将禁用按钮的文本颜色更改为黑色?

java - 如何使用 Swing 在 JFrame 中添加面板

java - 国家、州和城市微调器无法正常工作