1

我有一个 JFrame,其中一个按钮必须将它自己作为父框架传递,我会使用this关键字,但它返回的是 actionlistener,而不是 JFrame。有解决方法还是我写得不好?

编码:

start.addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent e)
        {
            kMeans=new KMeans(mainWindow.table, Integer.parseInt(centroids.getText()),this);
        }
    });
4

5 回答 5

2

因为这段代码:

new ActionListener()
{
    public void actionPerformed(ActionEvent e)
    {
        kMeans=new KMeans(mainWindow.table, Integer.parseInt(centroids.getText()),this);
    }
}

实际上已经创建了一个新对象。当您this在此实现的方法中使用关键字时,ActionListener它实际上使用this对象,即ActionListener.

如果您this在上述块之外使用,它将引用 JFrame 实例。

如果您想this在 ActionListener 中引用 AFrame 的实例,您可以AFrame.this按照评论中的说明进行操作。其中 AFrame 是您的框架类的名称,不确定您的代码中有哪个名称。

于 2013-03-11T16:34:43.587 回答
2

有一种解决方法。要this在引用外部类时使用关键字,您可以使用ClassName.this. 例如:

class MyFrame extends JFrame {
    public void someMethod () {
        someButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                ActionListener thisListener = this; // obviously
                MyFrame outerThis = MyFrame.this; // here's the trick
            }
        });
    }
}
于 2013-03-11T16:37:33.280 回答
1

您正在尝试将外部类的引用传递给匿名内部类。为此,您应该使用OuterClassName.this. 请参见下面给出的示例。

import javax.swing.*;
import java.awt.event.*;
class FrameExample extends JFrame
{
    private void createAndShowGUI()
    {
        JButton button = new JButton("Click");
        getContentPane().add(button);
        button.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent evt)
            {
                JOptionPane.showMessageDialog(FrameExample.this,"This is the message","Message",JOptionPane.OK_OPTION);//Passing the reference of outer class object using FrameExample.this
            }
        });
        pack();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }
    public static void main(String[] args) 
    {
        SwingUtilities.invokeLater( new Runnable()
        {
            @Override
            public void run()
            {
                FrameExample fe = new FrameExample();
                fe.createAndShowGUI();
            }
        });
    }
}
于 2013-03-11T16:41:22.690 回答
0

你应该使用JFrameClassName.this. 因此,如果 JFrame 的名称是 MainWindow,您的代码将是:

new ActionListener()
{
    public void actionPerformed(ActionEvent e)
    {
        kMeans=new KMeans(mainWindow.table, Integer.parseInt(centroids.getText()), MainWindow.this);
    }
}
于 2013-03-11T16:36:40.383 回答
0

使用 ActionEvent 中的 getSource() 方法访问发生事件的对象。例子 :JMenuItem menuItem = (JMenuItem) e.getSource();

于 2013-03-11T16:39:32.723 回答