【发布时间】:2011-11-02 07:05:46
【问题描述】:
当前我可以通过按“添加”JButton 将一堆自定义组件对象添加到 JPanel。我还有一个“删除”JButton,我希望与“添加”相反。
我的意图是我可以用鼠标选择一个组件,然后单击删除按钮并按下!,该组件就消失了。
我将 MouseListener 连接到面板,并使用 MouseEvent,e.getComponent() 来获取鼠标单击的当前组件。因此,如果它返回一个自定义组件,那么一个变量“private myComponent current”(已经设置为 null)将指向该组件。然后我可以单击“删除”按钮将其删除。已在“删除”按钮中添加了一个 actionListener,并在主体中调用 this.remove(current)(如果 current 不为 null)。
但是,这不起作用,因为我无法删除组件!有指针吗?
如果有管理添加/删除组件的优雅方法,请提出建议!
public class MainDisplayPanel extends JPanel implements ActionListener, MouseListener{
private JButton newClassButton;
private JButton deleteButton;
private Resizable current;
private Resizable resizer;
public MainDisplayPanel(LayoutManager layout) {
super(layout);
newClassButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
addResizer();
}
});
deleteButton = new JButton("Delete");
deleteButton.addActionListener(this);
this.addMouseListener(this);
this.add(newClassButton);
this.add(deleteButton);
}
public void addResizer() {
//JPanel panel = new JPanel();
//panel.setBackground(Color.white);
resizer = new Resizable( new ClassBox());
this.add(resizer);
this.revalidate();
this.repaint();
}
public void actionPerformed(ActionEvent e) {
if(current!=null)
{
this.remove(current);
this.revalidate();
this.repaint();
}
}
public void mouseClicked(MouseEvent e) {
System.out.println(e);
Component component = e.getComponent();
if(component instanceof Resizable)
current= (Resizable) e.getComponent();
}
public static void main(String[] args) {
JFrame jframe = new JFrame();
jframe.add(new MainDisplayPanel(null));
jframe.setSize(new Dimension(600,400));
jframe.setVisible(true);
jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
} 呵呵!
现在,在 addResizer() 方法中。每次我按下添加按钮添加一个新的 Resizable 对象时,之前添加的对象会发生什么?我确定它们变为 null 因为 resizer 变量不再引用它们???即使是这种情况,它们仍然显示在面板上......如果我按下删除,只有新添加的 Resizable 对象会被删除。那么我是不是在正确的轨道上?
编辑:总结一下我的问题,我将 MouseListener 挂到了错误的对象上。它应该是 Resizable 对象而不是面板。因此,可变电流始终为空。
【问题讨论】:
-
如果没有您的一些代码,很难说出确切的问题,但我的猜测是某种范围问题(尤其是对于任何匿名听众)。否则,我想这大概也是我会尝试的……
-
是的,我使用匿名监听器。也添加了一些代码。