2011-03-14 38 views
0

下面的代码在循环内生成一个按钮,并尝试从按钮内部传递一个字符串参数给按钮侦听器。我没有达到预期的效果。当我按下每个唯一的'buttonField'对象时,变量'key'在新屏幕上的值相同。下面的代码是否正确?将变量从监听器中传递给构造函数

由于

Enumeration keysEnumeration = table.keys(); 
    while(keysEnumeration.hasMoreElements()){ 

      key = (String)keysEnumeration.nextElement(); 
    buttonField.setChangeListener(new FieldChangeListener() { 
      public void fieldChanged(Field field, int context) { 
       UiApplication.getUiApplication().pushScreen(new Screen(key)); 
      } 
     }); 
     add(buttonField);  
    } 

回答

1

貌似key是封闭类的字段。

删除。使密钥分配的声明和final

final String key = (String)keysEnumeration.nextElement(); 

这将会给你的听众容易实例的不同key变量等相应的键。

您可能还想要删除和修改可能存在的问题,使用Java 2集合(Swing的一些仍然绑定到1.1,这很不幸,因为它实际上并不在1.1中)和泛型(如2004年推出的!)。 (编辑:看你有没有黑莓标签是他们仍然存在。?)

+0

黑莓jde im中不支持泛型使用 – 2011-03-14 15:08:29

+0

感谢您的帮助,它现在的工作。你介意阐述为什么关键需求是最终的? - – 2011-03-14 15:09:08

+0

@ user470184 Java规范要求它。它可能已被定义为不必要的,并且内部类引用该字段(对引用的最终引用)或者创建值(它是引用)的副本。任一选项都可能导致特定代码的非显而易见的行为。也许更好地使该领域有效或隐含地最终。所以到目前为止,Java一直坚持一种功能性的方法,即让变量不变。 Lambdas在JDK8中是一样的。 – 2011-03-14 15:20:58

0
Enumeration keysEnumeration = table.keys(); 

    while (keysEnumeration.hasMoreElements()) { 
     final String key = (String) keysEnumeration.nextElement(); 
     buttonField.setChangeListener(new FieldChangeListener() { 
      public void fieldChanged(Field field, int context) { 
       UiApplication.getUiApplication() 
         .pushScreen(new Screen(key)); 
      } 
     }); 
     add(buttonField); 
    } 

key应该最终是匿名内部类中访问。

+0

感谢您的帮助,它现在的工作。你介意阐述为什么关键需求是最终的? – 2011-03-14 15:07:46

相关问题