Jlist sureIndexIsVisible вызывает исключение - PullRequest
2 голосов
/ 15 марта 2012

Я могу искать элементы случайным образом в Jlist с помощью следующей кнопки.Когда я быстро нажимаю следующую кнопку, я получаю исключение: Исключение в потоке "Thread-7" java.lang.ClassCastException: sun.java2d.NullSurfaceData не может быть преобразовано в sun.java2d.d3d.D3DSurfaceData. Так как частотащелчок далее вызывает эту проблему, можем ли мы сказать, что что-то не так с потоками?В качестве заметки в jlist нет обновлений.Jlist инициализируется и заполняется элементами при запуске, а затем просто ищет элементы случайным образом с помощью следующей кнопки.Если я удаляю sureIndexIsVisible, тогда проблем не будет.

Надеюсь, приведенный ниже сводный код поможет:

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 Ответ

1 голос
/ 18 марта 2012

Попробовав разные потоки и выполнив поиск в потоке отправки событий, я обнаружил, что это связано с 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);
        }
    });
}

Поэтому убедитесь, что если у вас периодически возникают такие проблемы с графическим интерфейсом, проверьте, выполняете ли вы эту операцию в EDT, проверяя isEventDispatchThread ().

...