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

时间:2014-07-30 03:41:58

标签: java swing repaint

我试图通过点击它的按钮来删除对象,但是当我单击面板内的按钮时它会删除最后创建的面板。

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

这是我的代码:

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

1 个答案:

答案 0 :(得分:2)

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

答案很长,将每个order小组分成自己的,自包含和管理的实体,这样您就不会遇到现在的参考问题...... < / p>

简短回答,从ActionEvent ...

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

您可以使用Action生成一个自包含的工作单元,您可以通过order的当前实例的引用,这将允许Action维护它#39;自己的引用与TimerPractice

分开