没有ItemListener工作得很好,但是当我添加它时,它给了我一个NullPointerException



我为我的类编写了一个简单的swing程序,它可以根据ComboBox中的选定索引更改时区和其他一些东西。当方法run()看起来像这样时可以正常工作:

public void run() {
        while(true){
            Calendar c = Calendar.getInstance();
            int h = c.get(Calendar.HOUR);
            int m = c.get(Calendar.MINUTE);
            int s = c.get(Calendar.SECOND);
            l.setText(""+h+":"+m+":"+(s<10?"0"+s:s));
            try {
                t.sleep(1000);
            } catch (InterruptedException ex) {}
        }
    }

但是,当我试图重新定义它并使时间更改工作时,我在这一行中得到一个空指针异常:

p.cb.addItemListener(new ItemListener() {

方法run()看起来像这样,它不会工作。什么好主意吗?

public void run() {
    while(true){
        p.cb.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                Calendar c = Calendar.getInstance();
                int h = c.get(Calendar.HOUR);
                int m = c.get(Calendar.MINUTE);
                int s = c.get(Calendar.SECOND);
                int index = p.cb.getSelectedIndex();
                if(index == 0){
                    l.setText(""+h+":"+m+":"+(s<10?"0"+s:s));
                }
                else if(index == 1){
                    l.setText(""+(h-6)+":"+m+":"+(s<10?"0"+s:s));
                }
                else if(index == 2){
                    l.setText(""+(h-1)+":"+m+":"+(s<10?"0"+s:s));
                }
                else if(index == 3){
                    l.setText(""+(h-6)+":"+m+":"+(s<10?"0"+s:s));
                }
                else if(index == 4){
                    l.setText(""+(h+8)+":"+m+":"+(s<10?"0"+s:s));
                }
            }
        });
        try {
            t.sleep(1000);
        } catch (InterruptedException ex) {}
    }
}

如果有人感到困惑,p是JFrame类的一个实例,而cb是JFrame类中对ComboBox的引用。

由于pcb具有null值,导致NullPointerException被抛出

你的线程现在没有意义了。它每秒钟向组合框添加一个ItemListener,但是每个ItemListener都在做同样的事情。此外,您的线程正在修改EDT之外的gui元素。您需要在EDT上添加ItemListener。

我假设你要做的是每秒钟更新一个标签或当组合框被改变。

您应该不使用线程,而是使用Swing Timer和ItemListener的组合。

// called on the EDT
void setup() {
     // create gui elements
     p.cb.addItemListener(new ItemListener() {
        updateTimeLabel();
     }
     new Timer(1000, new ActionListener() {
        public void actionPerformed(ActionEvent evt) {
           updateTimeLable()
        }
     });
 }
 private void updateTimeLabel() {
     Calendar c = Calendar.getInstance();
     int h = c.get(Calendar.HOUR);
     int m = c.get(Calendar.MINUTE);
     int s = c.get(Calendar.SECOND);
     int index = p.cb.getSelectedIndex();
     if(index == 0){
        l.setText(""+h+":"+m+":"+(s<10?"0"+s:s));
     }
     else if(index == 1){
         l.setText(""+(h-6)+":"+m+":"+(s<10?"0"+s:s));
     }
     else if(index == 2){
         l.setText(""+(h-1)+":"+m+":"+(s<10?"0"+s:s));
     }
     else if(index == 3){
          l.setText(""+(h-6)+":"+m+":"+(s<10?"0"+s:s));
     }
     else if(index == 4){
          l.setText(""+(h+8)+":"+m+":"+(s<10?"0"+s:s));
     }
 }

至于为什么您现在得到空指针异常,它可能是由于访问尚未初始化的不同变量、内存可见性问题、线程的竞争条件或修改了EDT之外的GUI元素引起的。如果你删除线程,除了第一个条件外,所有这些条件都消失了。这样就很容易确保在调用addItemListener方法之前初始化p.b b。

你应该使用比p, cb, l更有描述性的名字

如果有人感到困惑,p是JFrame类的一个实例,而cb是JFrame类中对ComboBox的引用。

Instance of JFrame?你为什么要采用这种方法?只需调用ComboBox变量并添加侦听器!p似乎是NULL

相关内容

  • 没有找到相关文章

最新更新