当前位置: 首页 > 知识库问答 >
问题:

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

张璞
2023-03-14

所以这是一个更大程序的片段。下面的代码中没有显示我已经正确设置的JFrame“框架”,它还包含一个带有各种JLabels的JGroup。我在下面的代码中的目标是让我访问对象“face”的一种方式,它是扩展JGroup的“facer”类型,其中“facer”被正确添加到JFrame“框架”中,所有这些都正确显示。下面的代码显示了我尝试过的一些东西。无论我在哪里使用. getName(),我总是得到null。“line4”让我可以访问scrollPane而不是对象,我也将其添加到JFrame中。我也觉得奇怪的是getPak(). getPak()给出了一个JLayeredPane(我没有使用)而不是一个JFrame。

所有这些基本上都是我一直坚持的真实代码领域的一个淡化版本,但解决这个问题基本上会告诉我在另一个场景中该怎么做。基本上,我要问的是如何获得getParent()。getName()或getParent()。getParent()。getName()打印出对象的名称(在本例中是“Faser”或“framer”),而不是空值或其类型信息,如下面我的输出所示。

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个答案

齐锐进
2023-03-14

你说:“对象”face”,它是扩展JGroup的“facer”类型。我读到这是说你有这样的东西:

public class facer extends JPanel { ... }

然后你会:

facer face = new facer(...);

现在,在您的输出中,您正试图找到输出facer。您的问题是您误解了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());
 类似资料:
  • 我想知道我将如何获得被点击的按钮的id(因为它是未知的)。因此,当单击按钮时,我知道该特定按钮的id是什么。页面上有很多按钮,我想知道按下了哪个按钮(它们都有唯一的id)。当前按钮如下所示:

  • 如何在Children内部拿到父级的ref? 父级是不同的组件

  • 问题内容: 我对Java(作为C ++程序员)有一点疑问。 我有2个相关课程: 这将输出: org.example.smartgwt.server.model.PatientPersistent类 有没有一种方法可以获取父类的类型?即 org.example.smartgwt.server.model.Patient类。 这将使我能够概括一些我需要在每个可怕的孩子中实现的方法。 谢谢! 更新 我正

  • 我不知道这是否是一个“反应”解决方案,但我需要从子组件获取父组件的类名,原因如下。如果你能提供一个不同的方法来解决这个问题,我将不胜感激。 我有以下组成部分: 文章标题 ArticleMeta 文章正文 ArticleImage 文章 文章组件当前包括所有其他组件,但我想对此进行更改。我希望我的文章组件如下所示: 我希望有人能写下这样的东西: 我希望ArticleImage,ArticleHead

  • 问题内容: 我有一个API,它为我提供了Webpack处理的react组件,如下所示: 在react组件内部,我想获取此组件并显示它。到目前为止,这是我尝试过的方法,但不幸的是它没有用。api提取有效,但仅将组件显示为字符串。 我该如何在代码中的api获取的组件中使用它? 问题答案: 通过使用最新的Chrome,您可以执行以下操作: ProfilePage将是一个惰性组件。提取完成后将加载它。等待

  • 这是我第一次尝试实现。我在和类之间实现了一个接口来处理UI元素(按钮)上的点击事件。我在获取对发生单击的的引用时遇到问题。我可以单击列表中第一个项目的,但是我定义的操作是在我的回收器视图中的最后一个上执行的。我终于想出了通过我的界面传递这个位置,但是我很难理解如何从它那里获得对那个查看者的引用。