如何使用getParent()获取被点击组件的父对象?

时间:2014-12-20 04:56:39

标签: java swing user-interface jcomponent mouse-listeners

所以这是一个更大的程序的片段。以下代码中未显示的是JFrame"成帧器"我已经正确设置,其中还包含一个带有各种JLabel的JPanel。我在下面的代码中的目标是让我访问对象" face"属于" facer"它扩展了JPanel,其中" facer"被正确添加到JFrame" framer"所有这些显示正常。下面的代码显示了我尝试过的一些内容。无论我在哪里使用.getName()我总是得到null。 " LINE4"让我访问scrollPane而不是对象,我也将其添加到JFrame中。我也觉得奇怪的是getParent()。getParent()给出了一个JLayeredPane(我没有使用)而不是JFrame。

所有这些基本上都是我所坚持的实际代码区域的淡化版本,但解决这个问题基本上会告诉我在其他场景中该怎么做。基本上,我要问的是我如何得到getParent()。getName()或getParent()。getParent()。getName()来打印出对象的名称(在这种情况下是& #34; facer"或#34; framer")而不是null或其类型信息,如下面的输出所示。

face.addMouseListener(new MouseAdapter()
        {
            public void mouseClicked(MouseEvent e)
            {
                Component source = (Component) e.getSource(); //line1
                System.out.println("source gives me " + source); //line2
                System.out.println("getName() gives me " + source.getName()); //line3
                System.out.println("getParent().getComponent(1) gives me " + source.getParent().getComponent(0)); //line4
                System.out.println("getParent().getName() gives me " + source.getParent().getName()); //line5
                System.out.println("getParent().getParent() gives me " + source.getParent().getParent()); //line6
                System.out.println("getParent().getParent() gives me " + source.getParent().getParent().getName()); //line7

            }
        });

输出给了我

    source gives me facer[,0,0,200x288,alignmentX=0.0,alignmentY=0.0,border=,flags=9,maximumSize=,minimumSize=,preferredSize=]
    getName() gives me null
    getParent().getComponent(1) gives me javax.swing.JScrollPane[,30,-18,140x18,layout=javax.swing.ScrollPaneLayout$UIResource,alignmentX=0.0,alignmentY=0.0,border=javax.swing.plaf.metal.MetalBorders$ScrollPaneBorder@55e9e368,flags=328,maximumSize=,minimumSize=,preferredSize=,columnHeader=,horizontalScrollBar=javax.swing.JScrollPane$ScrollBar[,0,0,0x0,hidden,layout=javax.swing.plaf.metal.MetalScrollBarUI,alignmentX=0.0,alignmentY=0.0,border=,flags=4194632,maximumSize=,minimumSize=,preferredSize=,blockIncrement=10,orientation=HORIZONTAL,unitIncrement=1],horizontalScrollBarPolicy=HORIZONTAL_SCROLLBAR_NEVER,lowerLeft=,lowerRight=,rowHeader=,upperLeft=,upperRight=,verticalScrollBar=javax.swing.JScrollPane$ScrollBar[,0,0,0x0,hidden,layout=javax.swing.plaf.metal.MetalScrollBarUI,alignmentX=0.0,alignmentY=0.0,border=,flags=4194632,maximumSize=,minimumSize=,preferredSize=,blockIncrement=10,orientation=VERTICAL,unitIncrement=1],verticalScrollBarPolicy=VERTICAL_SCROLLBAR_NEVER,viewport=javax.swing.JViewport[,1,1,137x15,layout=javax.swing.ViewportLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=25165832,maximumSize=,minimumSize=,preferredSize=,isViewSizeSet=true,lastPaintPosition=,scrollUnderway=false],viewportBorder=]
    getParent().getName() gives me null.contentPane
    getParent().getParent() gives me javax.swing.JLayeredPane[null.layeredPane,0,0,200x288,invalid,alignmentX=0.0,alignmentY=0.0,border=,flags=0,maximumSize=,minimumSize=,preferredSize=,optimizedDrawingPossible=true]
    getParent().getParent() gives me null.layeredPane

1 个答案:

答案 0 :(得分:1)

你说:'object“face”是“facer”类型,它扩展了JPanel'。我读到这句话说你有类似的东西:

public class facer extends JPanel { ... }

然后你有:

facer face = new facer(...);

现在,在输出中,您正在尝试查找输出facer。您的问题是您误解了Swing组件上的名称。该名称是一个可以赋予swing组件的值(使用setName(String)),为应用程序提供一些有意义的名称。

您真正需要的是ClassName,该组件的类型的名称。

您的facer课程可能位于默认包中,也可能位于您自己的某个包中。例如,如果facer类在包com.example.myapp中,那么,如果添加代码:

System.out.println("source class name gives me " + source.getClass().getName());

然后输出:

com.example.myapp.facer

如果您只想要简单的类名,请尝试:

System.out.println("source class name gives me " + source.getClass().getSimpleName());