I have a JDialog with a thread in it. This sporadically gives me a ClassCastException when a dialog is created (which means that I can have successful, without exception), and I don't know where this is supposed to happen.
Here is a snippet of my JDialog class
public class ConfirmExitDialog extends JDialog implements Runnable,
ActionListener {
private static final long serialVersionUID = -8762051370686039110L;
private Thread dialogThread;
private boolean running;
private int result, count = 60;
private HandleExit handleExit = null;
private JOptionPane optionPane;
private JLabel msgLabel = new JLabel();
private JButton btnYes;
private JButton btnNo;
private void updateLabelText() {
msgLabel.setText("<html>Ønsker du at afslutte dagens salg?<br>Programmet afslutter automatisk om " + count + " sekunder.</html>");
}
public int getResult() {
return result;
}
public ConfirmExitDialog(Frame frame, HandleExit handleExit) {
super(frame, false);
this.handleExit = handleExit;
setTitle("Afslut dagens salg?");
display();
running = true;
if (dialogThread == null) {
dialogThread = new Thread(this, "ConfirmExitDialog");
dialogThread.start();
}
this.setModal(true);
}
public void close() {
if (dialogThread != null)
running = false;
}
private void display() {
setLayout(new BorderLayout());
btnYes = new JButton("Ja");
btnYes.addActionListener(this);
btnYes.setMnemonic('J');
add(btnYes, BorderLayout.WEST);
btnNo = new JButton("Nej");
btnNo.addActionListener(this);
btnNo.setMnemonic('N');
add(btnNo, BorderLayout.EAST);
JButton[] buttons = { btnYes, btnNo };
updateLabelText();
optionPane = new JOptionPane(msgLabel, JOptionPane.QUESTION_MESSAGE,
JOptionPane.YES_NO_OPTION, null, buttons, buttons[0]);
setContentPane(optionPane);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent we) {
optionPane.setValue(new Integer(JOptionPane.CLOSED_OPTION));
}
});
pack();
setVisible(true);
}
private void countDown() {
updateLabelText();
count--;
}
@Override
public void run() {
try {
display();
while (running && count > 0) {
System.out.println("Countdown " + count);
pack();
countDown();
Thread.sleep(1000);
}
setVisible(false);
if (count == 0)
handleExit.closeApplication(true, true);
} catch (InterruptedException ie) {
}
}
@Override
public void actionPerformed(ActionEvent event) {
Object src = event.getSource();
if (src == btnYes) {
setVisible(false);
result = JOptionPane.YES_OPTION;
running = false;
handleExit.closeApplication(true, false);
}
if (src == btnNo) {
setVisible(false);
result = JOptionPane.NO_OPTION;
running = false;
}
}
}
Here's the exception:
"AWT-EventQueue-0" java.lang.ClassCastException javax.swing.LayoutComparator.compare(LayoutComparator.java:61) java.util.Arrays.mergeSort(Arrays.java:1293) java.util.Arrays.mergeSort(Arrays.java:1282) java.util.Arrays.sort(Arrays.java:1210) java.util.Collections.sort(Collections.java:159) javax.swing.SortingFocusTraversalPolicy.enumerateAndSortCycle(SortingFocusTraversalPolicy.java:119) javax.swing.SortingFocusTraversalPolicy.getFirstComponent(SortingFocusTraversalPolicy.java:434) javax.swing.LayoutFocusTraversalPolicy.getFirstComponent(LayoutFocusTraversalPolicy.java:148) javax.swing.SortingFocusTraversalPolicy.getDefaultComponent(SortingFocusTraversalPolicy.java:511) java.awt.FocusTraversalPolicy.getInitialComponent(FocusTraversalPolicy.java:152) java.awt.Window.getMostRecentFocusOwner(Window.java:2131) java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:629) java.awt.Component.dispatchEventImpl(Component.java:4502) java.awt.Container.dispatchEventImpl(Container.java:2099) java.awt.Window.dispatchEventImpl(Window.java:2478) java.awt.Component.dispatchEvent(Component.java:4460) java.awt.EventQueue.dispatchEvent(EventQueue.java:599) java.awt.SequencedEvent.dispatch(SequencedEvent.java:101) java.awt.EventQueue.dispatchEvent(EventQueue.java:597) java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
.
Daniel