如果我从未将其分配给一个实例,为什么我的组件是JRootPane的实例?

时间:2015-10-15 07:35:27

标签: java user-interface jpanel jdialog

让我解释一下我的代码的作用: 我创建了自己的类,扩展了JDialog。这个类,我们称之为类A,包含:JMenuBar,JMenu,JMenuItem,JButton,JDialog,JPanel和MouseAdapter。我的项目与FreeCell游戏非常相似,我正在尝试移动多个图像,这些图像都在他们自己的JPanel中。 现在,我的问题是这样的:当用户点击屏幕上的某些内容时,我得到了他们点击的位置的协调点,并设置了像

这样的组件
Component component = getComponentAt(point);

然后我检查它是否是JPanel的一个实例,即卡

if (component instanceof JPanel)

所以我可以移动卡片。这就是我的问题所在。当我打印出我的组件类时,它表明它是一个JRootPane,但我从来没有在我的整个生命中使用或看过这个对象,直到我刚才查找它。我想知道为什么我的组件是JRootPane的对象,当我从未使用它时。

无论我在哪里点击屏幕,都会一直说明我的组件是JRootPane ......

这是因为JRootPane包含JDialog? https://docs.oracle.com/javase/7/docs/api/javax/swing/JRootPane.html

1 个答案:

答案 0 :(得分:0)

  

这是因为JRootPane包含JDialog?

没有JRootPane不包含JDialog。 JDialog包含一个JRootPanel。

  

我想知道为什么我的组件是JRootPane的对象,当我从未使用它时。

Component component = getComponentAt(point);

那么容器getComponentAt(...)所指的是什么?它是对话框,还是面板?

在您的情况下,getComonentAt()方法看起来与对话框相关,因此将返回相对于对话框的组件。由于添加到对话框的第一个组件是JRootPane,因此它返回根窗格。

您要做的是将MouseListener添加到包含图像的面板中。然后在MouseListener代码中执行:

@Override
public void mousePressed(MouseEvent e)
{
    Component parent = e.getComponent();  
    Component child = parent.getComponentAt(...);
}

然后,如果您单击包含图像的组件,您将获得该组件。