0

我已经编写了一个表单,并通过查看各种资源提出了一个可以在按下“X”时自行关闭的表单。但是,我似乎以一种相当 hack-tastic 的方式完成了它。

(我发布的代码已经去除了不相关的装饰细节,但它本质上是基于本教程的弹出通知:http: //harryjoy.me/2011/07/01/create- new-message-notification-pop-up-in-java/ )

public class Notification extends JFrame {

    private JFrame uglyJFrameHack;

    public Notification(String header, String message) {
        super();
        uglyJFrameHack = this;
        JButton closeBtn = new JButton("X");
        closeBtn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                uglyJFrameHack.dispose(); //here's where this all seems screwy.
            }
        });
        this.add(closeBtn);
        this.setVisible(true);
    }
}

如果没有引用其他内容,我似乎无法在 actionPerformed 方法中使用“this”。我做了一个System.out.println(this.getClass());,它给了我class Notification$1。因此,我尝试将其类型转换为 Notification 对象,但 Eclipse 给我一个错误说明Cannot cast from new ActionListener(){} to Notification

我设置它的方式有效并且似乎没有任何问题,但这似乎也不是一个好的做法。有一个更好的方法吗?谢谢大家。

4

2 回答 2

4

利用

Notification.this.dispose();

仅使用this是指ActionListener.


非常类似于:从内部类对象中获取外部类对象

于 2013-10-17T18:55:56.947 回答
2

通过访问事件的源对象来编写更通用的代码:

Window window = SwingUtilities.windowForComponent((Component)e.getSource());  
window.dispose();

现在您可以在任何 GUI 中使用此 ActionListener,因为您没有将类名硬编码为代码的一部分。

于 2013-10-17T19:08:13.353 回答