有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何指定“this”指的是什么?

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

守则:

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

共 (5) 个答案

  1. # 1 楼答案

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

    new ActionListener()
    {
        public void actionPerformed(ActionEvent e)
        {
            kMeans=new KMeans(mainWindow.table, Integer.parseInt(centroids.getText()), MainWindow.this);
        }
    }
    
  2. # 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
                }
            });
        }
    }
    
  3. # 3 楼答案

    因为这个代码:

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

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

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

    如果您想在ActionListener中引用框架的this实例,您可以按照注释中提到的那样执行AFrame.this。其中AFrame是frame类的名称,但不确定代码中的名称

  4. # 4 楼答案

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

  5. # 5 楼答案

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