我正在努力了解我正在玩的一些代码背后的工作原理。我有以下类是一个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上的文本。这是对的吗?
希望有意义!
答案 0 :(得分:0)
我认为这是因为在DrawFrame中传递的JLabel是通过的 引用(因为它是一个对象)和DrawPanel中的statusLabel是 引用testLabel,因此两个对象都指的是相同的 在内存中的位置,不是单独的对象,即更新 statusLabel上的文本也会更新testLabel上的文本。那会吗? 正确的吗?
或多或少,是的......
以这种方式思考,testLabel
是内存中某个点的名称,但仅限于创建它的上下文(DrawFrame
的构造函数)。
但是,您所做的是将该地址传递给DrawPane
,并将其命名为statusLabel
,testLabel
和statusLabel
现在都指向同一个地方在内存中(或该内存位置的对象)。
我可能会让你更加困惑,让你知道Java中的所有对象变量都是指针,但与C / C ++不同,你只需操作指针(只指向它指向的内容);)