2012-03-15 33 views
2

我可以通过下一个按钮在Jlist中随机搜索项目。当我快速按下一个按钮时,出现异常:线程“Thread-7”中的异常java.lang.ClassCastException:sun.java2d.NullSurfaceData无法转换为sun.java2d.d3d.D3DSurfaceData 因此,由于频率点击下一步触发这个问题,我们可以说线程有问题吗?作为说明,jlist中没有更新。 Jlist已经初始化并且在开始时填充了元素,然后随着下一个按钮随机地搜索这些项目。 如果我删除ensureIndexIsVisible,那么没有问题。Jlist ensureIndexIsVisible导致异常

我希望下面总结代码可以帮助:

public class B_Object { 
    private NewJFrame njf = new NewJFrame(); 
    HandlePlay hPlay = new HandlePlay(njf); 

    njf.nextButton.addActionListener(new java.awt.event.ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      playNext();     
     } 
    }); 
} 

public class HandlePlay { 
    private NewJFrame n_j_f; 
    HandlePlay(NewJFrame njf){ 
     n_j_f = njf; 
    } 
    private void setDisplay(int i) { 
     String str = "dummy"; 
     n_j_f.jList1.setSelectedIndex(i); 
     n_j_f.setTitle(str); 
     n_j_f.jTextArea1.setText(str); 
     n_j_f.jList1.ensureIndexIsVisible(n_j_f.jList1.getSelectedIndex()); 
    } 
} 
+4

请用[SSCCE](http://sscce.org/)编辑你的问题,嗯,我知道两个理由 – mKorbel 2012-03-15 19:51:33

+0

是什么原因?你能告诉他们吗? – markAnthopins 2012-03-15 20:48:42

+1

SSCCE在哪里?你可以发布吗? – 2012-03-15 21:00:41

回答

1

尝试不同的主题和搜索事件调度线程我发现它与EDT后有关。为了解决这个问题,下面的修改是不够的:

private void test(final int i) { 
    java.awt.EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      jList1.setSelectedIndex(i); 
      System.out.println("javax.swing.SwingUtilities.isEventDispatchThread()=" + javax.swing.SwingUtilities.isEventDispatchThread()); 
      jList1.ensureIndexIsVisible(i); 
     } 
    }); 
} 

所以一定要确保,如果你有这样的GUI问题intermittenly的现象发生,请检查您是否正在做EDT内的操作,通过isEventDispatchThread检查()。