2015-10-15 33 views
0

让我解释我的代码的作用: 我创建了自己的类,它扩展了JDialog。这个类叫做类A,它包含:JMenuBar,JMenu,JMenuItem,JButton,JDialog,JPanel和MouseAdapter。我的项目与FreeCell Game非常相似,目前我正尝试移动多个图像,这些图像位于它们自己的JPanel中。 现在,我的问题是这样的:当用户点击上的东西在屏幕上,我得到的点协调他们点击这里,并设置像为什么我的组件是JRootPane的一个实例,如果我从未将它分配给它的话?

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

https://docs.oracle.com/javase/tutorial/uiswing/components/rootpane.html – Stefan

+0

https://docs.oracle.com/javase/8/docs/api/javax/swing/JRootPane.html添加到例如一个JFrame。 –

回答

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(...); 
} 

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

相关问题