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编写代码,进行了很多黑客攻击和尝试……哦,没有生活是有帮助的;)