gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 11:10:58 26 4
gpt4 key购买 nike

所以这是一个更大程序的片段。以下代码中未显示的是我已正确设置的 JFrame“成帧器”,它还包含一个带有各种 JLabel 的 JPanel。我在下面的代码中的目标是一种访问对象“face”的方法,该对象是扩展 JPanel 的“facer”类型,其中“facer”已正确添加到 JFrame“framer”并显示所有这些内容适本地。下面的代码显示了我尝试过的一些事情。无论我在哪里使用 .getName() 我总是得到 null。 “line4”让我可以访问 scrollPane 而不是对象,我也已将其添加到 JFrame。我还发现奇怪的是 getParent().getParent() 给出了 JLayeredPane(我没有使用)而不是 JFrame。

所有这些基本上都是我所坚持的真实代码区域的简化版本,但解决这个问题基本上会告诉我在其他情况下该怎么做。基本上,我要问的是如何让 getParent().getName() 或 getParent().getParent().getName() 打印出对象的名称(在本例中为“facer”或“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

最佳答案

你说:'对象“face”是扩展 JPanel 的“facer”类型'。我读到这个是说你有类似的东西:

public class facer extends JPanel { ... }

然后你有:

facer face = new facer(...);

现在,在您的输出中,您正试图找到输出 facer。您的问题是您误解了 Swing 组件上的 Name 是什么....该名称是可以赋予​​ 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());

关于java - 如何使用 getParent() 获取被点击组件的父对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27577077/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com