Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何指定';这';指什么?_Java_This_Actionlistener - Fatal编程技术网

Java 如何指定';这';指什么?

Java 如何指定';这';指什么?,java,this,actionlistener,Java,This,Actionlistener,我有一个JFrame,其中一个按钮必须将框架作为父项传递给它自己,我会使用this关键字,但它返回的是actionlistener,而不是JFrame。有解决办法吗?还是我写得不好 守则: start.addActionListener(新ActionListener() { 已执行的公共无效操作(操作事件e) { kMeans=新的kMeans(mainWindow.table,Integer.parseInt(centroids.getText()),这个); } }); 因为此代码: ne

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

守则:

start.addActionListener(新ActionListener()
{
已执行的公共无效操作(操作事件e)
{
kMeans=新的kMeans(mainWindow.table,Integer.parseInt(centroids.getText()),这个);
}
});
因为此代码:

new ActionListener()
{
    public void actionPerformed(ActionEvent e)
    {
        kMeans=new KMeans(mainWindow.table, Integer.parseInt(centroids.getText()),this);
    }
}
实际上已经创建了一个新对象。 当您在这个
ActionListener
实现的方法中使用关键字
this
时,它实际上使用了
this
对象,它是一个
ActionListener

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

如果您想在ActionListener中引用此AFrame实例,您可以按注释中所述执行此AFrame。其中AFrame是frame类的名称,不确定代码中有哪个名称。

因为此代码:

new ActionListener()
{
    public void actionPerformed(ActionEvent e)
    {
        kMeans=new KMeans(mainWindow.table, Integer.parseInt(centroids.getText()),this);
    }
}
实际上已经创建了一个新对象。 当您在这个
ActionListener
实现的方法中使用关键字
this
时,它实际上使用了
this
对象,它是一个
ActionListener

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


如果您想在ActionListener中引用此AFrame实例,您可以按注释中所述执行此AFrame。其中,AFrame是框架类的名称,不确定代码中有哪个名称。

您应该使用
JFrameClassName。这是
。因此,如果JFrame的名称为MainWindow,则代码为:

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

您应该使用
JFrameClassName。这个
。因此,如果JFrame的名称为MainWindow,则代码为:

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

有一个变通办法。要在引用外部类时使用
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
            }
        });
    }
}

有一个变通办法。要在引用外部类时使用
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
            }
        });
    }
}
使用ActionEvent中的getSource()方法访问事件发生的对象。 示例:
JMenuItem menuItem=(JMenuItem)e.getSource()

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

您正在尝试将外部类的引用传递给匿名内部类。为此,您应该使用
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();
            }
        });
    }
}

您正试图将外部类的引用传递给匿名内部类。为此,您应该使用
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();
            }
        });
    }
}

包含该代码的类名是什么?否则,您可以执行
JFrame that=this
,然后传递
that
,而不是
this
@11684:那必须是
最终的JFrame that=this
;虽然这样做有效,但会使您的范围变得混乱,而且只需执行
ClassName就更简单了。这个
忘记尝试了,谢谢,解决了所有问题;)@WChargin当然你是对的,但我记得我曾经无法得到
类名。这个
可以工作(可能是因为我搞砸了),因此,我只想为OP提供一个替代方案。包含该代码的类名是什么?否则,您可以执行
JFrame that=this
,然后传递
that
,而不是
this
@11684:那必须是
最终的JFrame that=this
;虽然这样做有效,但会使您的范围变得混乱,而且只需执行
ClassName就更简单了。这个
忘记尝试了,谢谢,解决了所有问题;)@WChargin当然你是对的,但我记得我曾经无法获得
类名。这
无法工作(可能是因为我搞砸了),所以我只想为OP提供一个替代方案。创建一个新对象是什么意思?另外,您的答案有不完整的代码(缺少})Iswanto,感谢您贬低正确答案。干得好。你创建一个新对象是什么意思?另外,您的答案有不完整的代码(缺少})Iswanto,感谢您贬低正确答案。干得好。