Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:单击按钮时如何删除特定对象_Java_Swing_Repaint - Fatal编程技术网

Java:单击按钮时如何删除特定对象

Java:单击按钮时如何删除特定对象,java,swing,repaint,Java,Swing,Repaint,我试图通过单击某个对象的按钮来删除该对象,但当我单击面板内的按钮时,会删除上次创建的面板 问题是我将如何删除我想要的特定面板 这是我的密码: public class TimerPractice extends JFrame implements ActionListener { JPanel main=new JPanel(); JPanel gui=new JPanel(); JButton btnadd=new JButton("Add Timer"); J

我试图通过单击某个对象的按钮来删除该对象,但当我单击面板内的按钮时,会删除上次创建的面板

问题是我将如何删除我想要的特定面板

这是我的密码:

public class TimerPractice extends JFrame implements ActionListener
{
    JPanel main=new JPanel();
    JPanel gui=new JPanel();
    JButton btnadd=new JButton("Add Timer");
    JPanel order=new JPanel();

    public TimerPractice()
    {

        main.setLayout(new BorderLayout());
        gui.setLayout(new FlowLayout());
        main.add(btnadd, BorderLayout.NORTH);
        main.add(gui,BorderLayout.CENTER);
        add(main);
        btnadd.addActionListener(new ActionListener() 
        {
            @Override
            public void actionPerformed(ActionEvent e) 
            {
                //addPanel();
                //System.out.print(x);
                addPanel();
                revalidate();
                repaint();
            }
        });

        main.add(gui);
    }


    public void addPanel()
    {
        Border blackline=BorderFactory.createLineBorder(Color.BLACK);
        order=new JPanel();
        order.setPreferredSize(new Dimension(200,300));
        order.setLayout(new BorderLayout());
        TitledBorder title=BorderFactory.createTitledBorder(blackline);
        title.setTitleJustification(TitledBorder.LEFT);
        order.setBorder(title);
        addBtn();
        gui.add(order);
    }

    public void addBtn()
    {
        JButton remove=new JButton("Remove");
        order.add(remove, BorderLayout.SOUTH);
        remove.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                gui.remove(order);
                revalidate();
                repaint();
            }
        });
    }

    public static void main(String args[])
    {
        TimerPractice p=new TimerPractice();
        p.setSize(1000,800);
        p.setVisible(true);
        p.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        p.setLocationRelativeTo(null);
    }
}

每次添加新的
order
面板时,都会重新指定对
order
的引用,以指向上次创建的
JPanel
,这意味着当您说
remove(order)
时,它只知道如何删除上次创建的面板

答案很长,将每个
订单
面板分离为自己的、自包含的和受管理的实体,这样您就不会遇到您现在遇到的参考问题

简短回答,从
ActionEvent
中提取引用

public void actionPerformed(ActionEvent e)
{
    Object source = e.getSource();
    if (source instanceof Component) {
        Component comp = (Component)source;
        gui.remove(comp.getParent());
        revalidate();
        repaint();
    }
}

您可以使用生成一个自包含的工作单元,在每次调用
addPanel()时,您将传递
order
的当前实例的引用,这将允许
操作
维护其自身的引用,将其与创建新的
order
类分开
。跟踪使用ADT创建的所有新面板,例如,或者如果我不打算创建新的
订单
,那么它只会覆盖我创建的面板。关于将组件隔离到自包含/托管实体中的想法,你不必在意…@MadProgrammer很抱歉我知道的不多…创建一个从
JPanel
扩展的自定义类,它封装了当前
订单
窗格的职责。然后,管理和维护就变得简单多了。当我单击“删除”按钮时,它什么也不做。。。还有什么我需要编辑的吗?呵呵,打字太快了。它应该是触发动作事件的源的父级,请参阅UpdatesMazing!(:ahahahaha你怎么知道这一切的(:我羡慕你!:我从1999年就开始用Java和Swing编写代码,进行了很多黑客攻击和尝试……哦,没有生活是有帮助的;)