我为我的班制作了一个简单的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的引用。
答案 0 :(得分:4)
由于NullPointerException
或p
的{{1}}值为cb
,因此会引发null
。
答案 1 :(得分:1)
你的线程现在没有意义。它每隔几秒就向组合框添加一个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.cb。
另外,您应该使用比p,cb,l更具描述性的名称。
答案 2 :(得分:0)
如果有人感到困惑,p是JFrame类的一个实例,而 cb是对JFrame类中ComboBox的引用。
JFrame的实例?你为什么要这样做?只需调用ComboBox
变量并添加监听器即可! p
似乎是NULL
。