【问题标题】:Delete a specific button删除特定按钮
【发布时间】:2012-04-07 07:45:45
【问题描述】:

我在包含 5 个按钮的 JFrame 中有一个 JPanel。在另一个 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)
     }
   }

【问题讨论】:

  • 我们可能可以帮助您,如果您愿意为您的问题付出更多努力:您已经尝试了什么?任何简短但相关的代码示例?
  • 使用一个布尔变量来指示单击的下一个按钮将被“删除”。如果变量设置为 true,则单击其他按钮时,将按钮的可见性设置为 false。再次将布尔变量初始化为 false。
  • 提交代码时,请确保它运行。这节省了其他人的时间,并使他们能够专注于提出的问题。添加一个 main 方法,打包你的元素,设置一个默认的关闭操作,包括 include 语句,将你的组件添加到 JFrame 中并没有太多要求。
  • "我在 JFrame 中有一个 JPanel,它包含 5 个按钮。" 这些按钮有什么作用?这可能更适合一个 JList 中的多个元素
  • 您要选择一个答案吗?仅仅过去了3年多。我想这个问题现在已经解决了。

标签: java swing jpanel jbutton actionlistener


【解决方案1】:

最简单的方法:

  1. 将 ActionListener 添加到将删除另一个按钮的按钮;
  2. 重新绘制并重新验证要删除的按钮所在的面板。

示例(在这种情况下,将删除另一个按钮的按钮由“deleteBtn”调用,另一个面板中将被删除的按钮由“btnToDlt”调用>”,存在于“面板”中):

deleteBtn.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent e) {
            panel.remove(btnToDlt);
            panel.revalidate();
            panel.repaint();
            
        }
            
            });

【讨论】:

    【解决方案2】:

    这里有一段代码可以让你朝着正确的方向前进:

    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);
        }
    }
    

    点击前:

    点击后:


    来自cmets:

    为了概括这一点,您可以创建一个将要删除的按钮作为参数的 AbstractAction。使用此 AbstractAction,并在您的删除策略发生更改时根据需要进行更新。

    【讨论】:

    • 这就是我或多或少的东西,但是你所显示的删除按钮本身,我真正想要的是有一个删除另一个按钮的按钮......
    • 然后将删除按钮AAbstractAction设置为按钮B的动作。
    • 我没有说清楚,A 按钮上写着“DELETE”之类的内容会删除另一个可能会不时不同的按钮,这意味着我可能想删除按钮 C 一次然后按E
    • 好的,所以创建一个通用的AbstractAction,它将要删除的按钮作为参数。将按钮 A 的操作更新为在单击 A 时删除要删除的任何按钮的操作。
    【解决方案3】:

    在按钮侦听器中使用责任链。一个按钮侦听器,用于侦听“待删除”按钮和“删除”按钮。在正常操作下,此按钮侦听器只是将“待删除”按钮事件发送到现有按钮事件,但当它听到“删除”按钮事件时,它会捕获“下一个”按钮事件而不将其发送到现有按钮侦听器, 并移除按钮。

    好的,您提供了一些代码。这是一个使用责任链的解决方案。基本上,如果一个 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);
        }
      }
    }
    

    【讨论】:

    • 您对代码有什么建议吗?很抱歉,我是初学者,我不太确定你的意思...
    • 你是多少初学者?你可以用你的五个(或更多)按钮来绘制你的窗口吗?如果可以,请发布代码。如果您不知道什么是责任链,Google 可以为您提供比我能快速演示的更多(更好)的示例。
    • 是的,我什至可以做更多的事情,我会试着弄清楚责任链是什么......无论如何,谢谢
    • 如果您发布按钮的代码,并尝试编写一两个按钮侦听器,那么我将很乐意帮助它工作。如果您只提供任务的一般描述,您最多只能得到解决方案的一般描述。
    【解决方案4】:

    在这里试试这个代码:

    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();
                }
            });
        }
    }
    

    输出:

    、、

    【讨论】:

      【解决方案5】:

      看看玻璃板。这个tutorial 展示了它是如何使用的。

      在高层次上,单击“删除”按钮将使玻璃窗格侦听器进入以下状态:

      1. 检测到点击,
      2. 确定目标组件,
      3. 判断是否允许删除组件
      4. 如果是,请删除该组件。

      作为设计说明,我会保留一个Set 允许删除的控件,从而分离关注点。因此,当您添加一个允许删除的按钮时,您也有责任将其添加到删除候选集。

      【讨论】:

        猜你喜欢
        • 2015-03-28
        • 2019-05-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-09
        相关资源
        最近更新 更多