gpt4 book ai didi

java - 迭代/递归通过容器和组件来查找给定类的对象?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:59:02 25 4
gpt4 key购买 nike

我已经为 JLabel 和 AbstractButtons 编写了一个 MnemonicsBuilder 类。我想编写一个方便的方法 setMnemonics( JFrame f ) 来遍历 JFrame 的每个子对象并选择 JLabel 和 AbstractButtons。我怎样才能获得对 JFrame 中包含的所有内容的访问权?我试过:

LinkedList<JLabel> harvestJLabels( Container c, LinkedList<JLabel> l ) {
Component[] components = c.getComponents();
for( Component com : components )
{
if( com instanceof JLabel )
{
l.add( (JLabel) com );
} else if( com instanceof Container )
{
l.addAll( harvestJLabels( (Container) com, l ) );
}
}
return l;
}

在某些情况下,这工作得很好。在其他情况下,它会耗尽内存。我没有想到什么?有没有更好的方法来搜索子组件?我的递归有缺陷吗?这不是描述 Swing 中的事物如何“包含”其他事物的图片吗?例如,Swing 不是有根树吗?

JFrame
|
|\__JMenuBar
| |
| \__JMenu
| |
| \__JMenuItem
|
|\__JPanel
| |
| |\__JButton
| |
| |\__JLabel
| |
| |\__ ... JCheckBoxes, other AbstractButtons, etc.

最佳答案

同意 Tom 的观点...您的问题是您已经传递了 List 以将 JLabel 添加到您的递归方法中并且您还返回它 - 因此不止一次将相同的项目添加到您的列表中。用更政治正确的术语来说——List 是您的累加器。

您的方法应该如下所示:

public void harvestJLabels(Container c, List<JLabel> l) {
Component[] components = c.getComponents();
for(Component com : components) {
if(com instanceof JLabel) {
l.add((JLabel) com);
} else if(com instanceof Container) {
harvestJLabels((Container) com, l));
}
}
}

然后你可以有一个辅助方法来启动这个收获:

public List<JLabel> harvestJLabels(Container c) {
List<JLabel> jLabels = new ArrayList<JLabel>();
harvestJLabels(c, jLabels);
return jLabels;
}

关于java - 迭代/递归通过容器和组件来查找给定类的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/694287/

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