【问题标题】:How to modify a class variable through innerclass itemListener?如何通过内部类 itemListener 修改类变量?
【发布时间】:2014-05-19 21:05:19
【问题描述】:

我这里有以下代码:

public class A extends Runnable {
  ArrayList<String> choosenFiles;

  run(){
  /*graphic stuff such as JFrame,JLabel,JButtons*/
  }

  private ButtonListener implements ActionListener {
  /*options*/
  }

  public class cbListener implements ItemListener {
    @Override
    public void itemStateChanged(ItemEvent e) {
        Checkbox cb = (Checkbox)e.getItemSelectable();
        String cbl = cb.getLabel();

        if (e.getStateChange() == ItemEvent.SELECTED) {
            JOptionPane.showMessageDialog(null, "selected:\n" + cbl);
            choosenFiles.add(cbl);
        } else if (e.getStateChange() == ItemEvent.DESELECTED) {
            JOptionPane.showMessageDialog(null, "deselected:\n" + cbl);
            choosenFiles.remove(cbl);
        }
    }
}  

问题似乎是CBListener 无法到达choosenFile,因为出现了AWT-EventQueue-0 java.lang.NullPointerException

这是堆栈跟踪:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at FileDownloader.Client.User$cbListener.itemStateChanged(Unknown Source)
at java.awt.Checkbox.processItemEvent(Checkbox.java:563)
at java.awt.Checkbox.processEvent(Checkbox.java:530)
at java.awt.Component.dispatchEventImpl(Component.java:4660)
at java.awt.Component.dispatchEvent(Component.java:4488)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:674)
at java.awt.EventQueue.access$400(EventQueue.java:81)
at java.awt.EventQueue$2.run(EventQueue.java:633)
at java.awt.EventQueue$2.run(EventQueue.java:631)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege
(AccessControlContext.java:87)
at java.security.AccessControlContext$1.doIntersectionPrivilege
(AccessControlContext.java:98)
at java.awt.EventQueue$3.run(EventQueue.java:647)
at java.awt.EventQueue$3.run(EventQueue.java:645)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege
(AccessControlContext.java:87)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:644)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

有没有办法解决这个问题?

【问题讨论】:

  • 发布堆栈跟踪。你初始化choosenFiles了吗?
  • Stacktrace 发布编辑主帖。我确实将 choosenFile 初始化为 null
  • 如果是null,则没有引用对象。你不能在null上调用方法。
  • 那我应该如何初始化呢?对不起,我是新手的愚蠢问题......
  • 到一个对象。使用实例创建表达式,例如 new ArrayList&lt;&gt;();

标签: java awt inner-classes itemlistener


【解决方案1】:

choosenFiles 好像还没有初始化;这应该尽早发生,例如在构造函数或初始化方法中。 此外,最好使用尽可能通用的接口,因此如果没有很好的理由将choosenFiles 定义为ArrayList&lt;String&gt;,请将其定义为List&lt;String&gt;

【讨论】:

  • 非常感谢,但无论如何它都可以使用 ArrayList 我只是忘记按您所说的进行初始化...再次感谢!
  • 不客气@Irith。关于 ArrayList,我建议将定义更改为 List&lt;String&gt; 并对其进行测试;很少有程序必须知道它是ArrayList(这是List 的特化)的情况。你可以这样做:List&lt;String&gt; choosenFiles = new ArrayList&lt;&gt;().
  • 我按照您的建议在 List 中更改它,它显然有效,所以感谢您教我新东西!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-07
  • 2013-04-15
  • 2019-02-04
  • 2017-03-08
  • 2014-10-12
相关资源
最近更新 更多