【问题标题】:Select all the components of a array without a loop选择没有循环的数组的所有组件
【发布时间】:2009-11-07 15:38:47
【问题描述】:

我已经创建了一个充满 JLabels 的数组,并希望为它们添加一个监听器。

侦听器不需要确切知道点击了哪一个,只需知道那个。 有没有办法将侦听器添加到整个数组而不是使用“for()”循环?

感谢阅读。

【问题讨论】:

  • 为什么要避免使用 for 循环?顺便说一句,我认为没有其他方法..
  • 不要对 for() 这么刻薄。它在那里帮助你。使用它!
  • 好吧,如果有其他方法,它会让我的代码更轻量,所以我想知道。
  • 打火机?在什么条件下? for 循环在 RTL 指令实现中非常简单..
  • 只需在JLabel创建时添加监听器!!!

标签: java arrays listener


【解决方案1】:

如果您的标签被添加到容器(如 JPanel)中,您可以向该容器添加侦听器并知道哪个组件位于特定位置。

JPanel panel = new JPanel();
panel.addMouseListener( whichOneListener );
f.setContentPane( panel );

在这种情况下,我使用了 mouseListener,因为它为我提供了用户点击的位置。

private static MouseListener whichOneListener = new MouseAdapter() {
    public void mouseClicked( MouseEvent e ) {
        JComponent c = ( JComponent ) e.getSource();
        JLabel l  = ( JLabel ) c.getComponentAt( e.getPoint() );
        System.out.println( l.getText() );
    }

};

并正确打印单击了哪个组件。

完整源码是here

【讨论】:

    【解决方案2】:

    没有开箱即用的解决方案,AFAIK。除了使用愚蠢的黑客之外,我认为您可能必须使用 for 循环,并且它可能是 10 行代码,无需担心。

    【讨论】:

    【解决方案3】:

    您可以将您的 JLabels 数组包装在一个类中并实现您自己的 Add() 方法,该方法在添加它们时注册侦听器。

    这样你以后就不必遍历它们了..

    【讨论】:

      【解决方案4】:

      您可以在 JPanel(或按钮所在的任何组件)上注册侦听器,因此您只需编写一个侦听器。

      【讨论】:

        【解决方案5】:

        如果它是 JLabels 列表,我建议使用 CollectionUtils.forAllDo - 允许您对一堆对象应用相同操作的方法。

        【讨论】:

          猜你喜欢
          • 2020-06-16
          • 2017-02-03
          • 1970-01-01
          • 2016-06-18
          • 2020-06-02
          • 1970-01-01
          • 1970-01-01
          • 2017-03-30
          • 2021-12-14
          相关资源
          最近更新 更多