JLabel在与Mouse Handler对象不同的类中创建时如何更新

时间:2014-06-10 09:25:00

标签: java swing handler jlabel mouselistener

我正在努力了解我正在玩的一些代码背后的工作原理。我有以下类是一个JFrame,它只是创建一个JLabel,testLabel,并将其添加到框架以及向框架添加DrawPanel对象。创建的JLabel作为参数传递给DrawPanel构造函数。

package test;

//Import statements
import javax.swing.JFrame;
import javax.swing.JLabel;
import java.awt.BorderLayout;

public class DrawFrame extends JFrame
{
    public DrawFrame()
    {
        JLabel testLabel = new JLabel("Test");
        add(new DrawPanel(testLabel),BorderLayout.CENTER);
        add(testLabel,BorderLayout.SOUTH);
    }
}

DrawPanel类如下。该类将从DrawFrame传递的JLabel分配给JLabel statusLabel。该类还向面板注册一个鼠标处理程序,并侦听mouseMoved事件并使用游标的坐标更新statusLabel。

import javax.swing.JPanel;
import javax.swing.JLabel;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseAdapter;

public class DrawPanel extends JPanel 
{
    private JLabel statusLabel; 
    private JPanel labelPanel;

    public DrawPanel(JLabel statusLabel)
    {
        this.statusLabel = statusLabel;
        addMouseMotionListener(new MouseHandler()); 
    }

    private class MouseHandler extends MouseAdapter implements 
                                                    MouseMotionListener
    {
        public void mouseMoved(MouseEvent event)
        {
            statusLabel.setText(String.format("(%d, %d)", event.getX(),
                    event.getY()));
        }
    }//End inner class MouseHandler
}//End class DrawPanel

我想要了解的是,当在DrawPanel中创建的statusLabel上设置文本时,如何更新在DrawFrame中创建和添加的JLabel。

我认为这是因为传入DrawFrame的JLabel是通过引用传递的(因为它是一个对象),而DrawPanel中的statusLabel引用了testLabel,所以两个对象都指的是内存中的相同位置而不是单独的对象,即更新statusLabel上的文本也会更新testLabel上的文本。这是对的吗?

希望有意义!

1 个答案:

答案 0 :(得分:0)

  

我认为这是因为在DrawFrame中传递的JLabel是通过的   引用(因为它是一个对象)和DrawPanel中的statusLabel是   引用testLabel,因此两个对象都指的是相同的   在内存中的位置,不是单独的对象,即更新   statusLabel上的文本也会更新testLabel上的文本。那会吗?   正确的吗?

或多或少,是的......

以这种方式思考,testLabel是内存中某个点的名称,但仅限于创建它的上下文(DrawFrame的构造函数)。

但是,您所做的是将该地址传递给DrawPane,并将其命名为statusLabeltestLabelstatusLabel现在都指向同一个地方在内存中(或该内存位置的对象)。

我可能会让你更加困惑,让你知道Java中的所有对象变量都是指针,但与C / C ++不同,你只需操作指针(只指向它指向的内容);)