Проблема с setCursor () после закрытия модального JComponent - PullRequest
1 голос
/ 14 марта 2019

Когда я создаю модальный JComponent, мышь (правильно) меняется на курсор по умолчанию.Однако, когда я закрываю компонент, у меня возникает странная проблема.

  • Если я закрою компонент, когда мой курсор содержится в границах компонента, курсор будет правильно возвращен.
  • Если я закрою компонент, когда мой курсор находится за пределами (например, с помощью esc), курсор не вернется, даже при вызовах setCursor ().

Как я могу правильномой курсор вернется в обоих случаях не хакерским способом?

Пример кода:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;

class ModalTest {
    public static void main (String[] args) {

        // Create a frame.
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setPreferredSize(new Dimension(800, 600));
        frame.pack();
        frame.setLocationRelativeTo(null);

        // Add a button.
        JButton button = new JButton();
        frame.add(button);
        frame.revalidate();
        frame.setVisible(true);

        frame.setCursor(Cursor.HAND_CURSOR);

        // While the mouse is inside the JFrame, the cursor should be Cursor.HAND_CURSOR.
        // And when the modal JOptionPane is visible, the cursor should be Cursor.DEFAULT_CURSOR.
        // However, when that modal JComponent is closed while the cursor is outside it, it does
        // not revert to Cursor.HAND_CURSOR.
        button.setAction(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                JOptionPane.showConfirmDialog (
                    frame,
                    "Move the cursor inside, then outside of this component and press Esc. The cursor will stay default.",
                    "Cursor Test",
                    JOptionPane.YES_NO_OPTION
                );
                // Even if you change the cursor after, it stays default.
                frame.setCursor(Cursor.CROSSHAIR_CURSOR);
            }
        });
    }
}
...