我有一个JFrame,其中一个按钮必须传递它作为父亲的框架,我会使用这个关键字,但它返回的是actionlistener,而不是JFrame。是否有解决方法或我写得不好?
代码:
start.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
kMeans=new KMeans(mainWindow.table, Integer.parseInt(centroids.getText()),this);
}
});
答案 0 :(得分:2)
因为这段代码:
new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
kMeans=new KMeans(mainWindow.table, Integer.parseInt(centroids.getText()),this);
}
}
实际上已经创建了一个新对象。
当您在此this
实施的方法中使用关键字ActionListener
时,它实际上使用this
对象,即ActionListener
。
如果在上面的块之外使用this
,它将引用JFrame实例。
如果您想在ActionListener中引用this
AFrame实例,可以按照评论中的说明进行AFrame.this
。其中AFrame是您的框架类的名称,不知道您的代码中有哪个名称。
答案 1 :(得分: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
}
});
}
}
答案 2 :(得分: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();
}
});
}
}
答案 3 :(得分:0)
您应该使用JFrameClassName.this
。因此,如果JFrame的名称是MainWindow,那么您的代码将是:
new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
kMeans=new KMeans(mainWindow.table, Integer.parseInt(centroids.getText()), MainWindow.this);
}
}
答案 4 :(得分:0)
使用ActionEvent中的getSource()方法访问发生事件的对象。
示例:JMenuItem menuItem = (JMenuItem) e.getSource();