2016-11-27 78 views
0

这个代码有问题,它不能编译。你可以帮帮我吗 ? 我需要关闭的JFrame当我按一下按钮用JButton关闭JFrame

public class SlotMachine extends JFrame 
{ 
    /* 
    * 
    */ 
    JButton btnExit = new JButton("Exit"); 
    btnExit.addMouseListener(new MouseAdapter() 
    { 
     @Override 
     public void mouseClicked(MouseEvent arg0) 
     { 
      this.dispose(); 
     } 
    }); 
} 

的错误是= 的方法Dispose()是未定义的类型新MouseAdapter(){}

我不知道如何从方法的mouseClicked

+0

如果不是编译,你不知道为什么,那么发布完整的错误信息是有道理的,不是吗? –

+0

另一个问题:从来没有使用MouseListener进行此操作,而是将一个ActionListener添加到JButton中,原因有很多。 –

+0

摆脱'this'。而已。或者用'SlotMachine.this'指定*哪个*'this'。 –

回答

1

你调用this.dispose();这里的关键之处在于this指的是内部类中,MouseListener的获得SlotMachine对象,MouseListener的没有一个dispose()方法。

解决方案:摆脱this,它应该工作,因为如果内部类不包含该方法,编译器将查看外部类。或者,您可以指定其中您的意思是:SlotMachine.this.dispose();将告诉编译器调用外部SlotMachine类的方法。

使用上一个JButton一个ActionListener有以下几个原因:按钮的

  • 默认行为是通过按空格键来激活按钮是否集中。这对于MouseListener不起作用。
  • 此外,预期的行为是,如果按钮通过setEnabled(false)被禁用,然后按它不应导致行动被解雇。这不适用于MouseListener,但适用于ActionListener。
  • 您可以轻松与其他组件(包括JMenuItems)共享ActionListener(或更好的AbstractAction)。
+0

谢谢,但即使我使用ActionListener,我必须使用SlotMachine.this.dispose()? – Yuri

+0

@Yuri:当然可以。你仍然在使用一个匿名的内部类。否则,只需使用'dispose();' –

+0

谢谢我也在java文档中研究了这一点,并知道它的工作原理:) – Yuri