2012-03-15 66 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檢查()。