Jlist ensureIndexIsVisible导致异常

时间:2012-03-15 19:44:04

标签: java swing user-interface jlist listselectionlistener

我可以使用下一个按钮在Jlist中随机搜索项目。当我快速按下下一个按钮时,我得到异常:线程“Thread-7”中的异常java.lang.ClassCastException:sun.java2d.NullSurfaceData无法强制转换为sun.java2d.d3d.D3DSurfaceData 因此,由于点击下一个频率触发了这个问题,我们可以说线程有问题吗?作为注释,jlist中没有更新。 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());
    }
}

1 个答案:

答案 0 :(得分: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问题,请确保你是否在EDT中进行了这项操作,并通过isEventDispatchThread()进行检查。