让我解释一下我的代码的作用: 我创建了自己的类,扩展了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
答案 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(...);
}
然后,如果您单击包含图像的组件,您将获得该组件。