我试图通过点击它的按钮来删除对象,但是当我单击面板内的按钮时它会删除最后创建的面板。
问题是如何删除我想要的特定面板?
这是我的代码:
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);
}
}
答案 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
类