Search code examples
javaswingmodal-dialogjdialogmouse-cursor

Modal dialog prevents correct cursor state


I have problem with displaying modal dialog and busy cursor at the same time.

I display a modal dialog and set the cursor of the main frame on "waiting state". Everything is fine, except that if the mouse exits the main frame and enters again, it never comes back on "waiting state". This bug (?) doesn't happen if the dialog is not modal.

The test program:

    public static void main(String[] args) {
        final JFrame frame = new JFrame();
        frame.setSize(new Dimension(500, 500));

        final JDialog dialog = new JDialog(frame);
        dialog.setModal(true);

        frame.add(new JButton(new AbstractAction("Dialog") {
            @Override
            public void actionPerformed(ActionEvent e) {
                frame.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
                dialog.setVisible(true);
            }
        }));
        frame.setVisible(true);
    }

Solution

  • frame.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));

    • Cursor is possibe to change (or change is visible) for window that have got focus, this is basic properties for Modal window or for ModalityTypes,

    it never comes back on "waiting state". This bug (?) doesn't happen if the dialog is not modal.

    • after child JDialog is closed, then JFrame could be changed Cursor to WAIT_CURSOR

    • you to visible the changed Cursor by removing setModal() or to change changing ModalityTypes to the ModalityType.MODELESS