Java 如何从JButton'内部从JFrame中移除JButton;谁是行动听众?

Java 如何从JButton'内部从JFrame中移除JButton;谁是行动听众?,java,swing,jframe,jbutton,Java,Swing,Jframe,Jbutton,在编写Swing应用程序时,我总是遇到这样的问题,我想我最终会得到一个明确的答案,而不是一直玩到它工作为止 我有一个JFrame。在这个JFrame中有一个JButton。在ActionListener中,我希望几乎清空JFrame,留下一个或两个组件(包括删除JButton)。然后应用程序冻结,因为在ActionListener完成之前,您无法删除该组件。如何解决这个问题?在移除组件时,不要忘记调用容器上的validate()和repaint(),应该可以正常工作 import java.aw

在编写Swing应用程序时,我总是遇到这样的问题,我想我最终会得到一个明确的答案,而不是一直玩到它工作为止


我有一个JFrame。在这个JFrame中有一个JButton。在ActionListener中,我希望几乎清空JFrame,留下一个或两个组件(包括删除JButton)。然后应用程序冻结,因为在ActionListener完成之前,您无法删除该组件。如何解决这个问题?

在移除组件时,不要忘记调用容器上的
validate()
repaint()
,应该可以正常工作

import java.awt.Component;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class RemoveDemo {

    static class RemoveAction extends AbstractAction{
        private Container container;

        public RemoveAction(Container container){
            super("Remove me");
            this.container = container;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            container.remove((Component) e.getSource());
            container.validate();
            container.repaint();    
        }
    }

    private static void createAndShowGUI() {
        final JFrame frame = new JFrame("Demo");
        frame.setLayout(new FlowLayout());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        RemoveAction action = new RemoveAction(frame);
        frame.add(new JButton(action));
        frame.add(new JButton(action));

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}

用于在事件队列中添加合适的
Runnable
。它“将在处理所有未决事件后发生。”

。您的工作代码只需要初始的
invokeLater()
,这也提出了一个问题,即为什么CPCookieMan的(看不见的)代码会冻结。工作非常好,将来会记住此方法。非常感谢@不用担心,很高兴它帮助了你!虽然Max的例子让我更容易找到问题,但我还是得到了+1。谢谢,不管怎样。