所以这是一个更大的程序的片段。以下代码中未显示的是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
答案 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());