swing: установка курсора на JDialog - PullRequest
0 голосов
/ 22 февраля 2010

У меня есть JPanel внутри диалога. MouseListener слушает движения мыши, и когда мышь находится в определенном месте, я вызываю setCursor () на панели, чтобы изменить курсор.

Это все работает хорошо, пока я не открою другой диалог из этого диалога и снова закрою его. (Например: предупреждающее сообщение (JOptionPane) или новый пользовательский JDialog. После этого действия курсор снова не меняется, хотя я все еще вызываю 'setCursor'.

Кто-нибудь знает, что происходит? И как это решить?

Ответы [ 2 ]

2 голосов
/ 22 февраля 2010

Я попробовал следующее, и оно работало нормально, даже после отображения другого JDialog (в Windows, JDK 1.6.0_12).

Курсор мыши меняется каждые 50 пикселей в горизонтальном направлении, при нажатии JPanel открывается модальный JDialog. Закройте его снова, и курсор мыши все еще изменится.

public class DialogCursorTest extends JDialog{
    public DialogCursorTest() {
        final JPanel panel = new JPanel();
        panel.addMouseMotionListener(new MouseMotionAdapter() {
            Cursor handCursor = new Cursor(Cursor.HAND_CURSOR);
            @Override
            public void mouseMoved(MouseEvent e) {
                if(e.getX() % 100 > 50) {
                    if(panel.getCursor() != handCursor) {
                        panel.setCursor(handCursor);
                    }
                }
                else {
                    if(panel.getCursor() == handCursor) {
                        panel.setCursor(Cursor.getDefaultCursor());
                    }
                }
            }
        });

        panel.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                new JDialog(DialogCursorTest.this, "Test", true).setVisible(true);
            }
        });

        getContentPane().add(panel);
    }

    public static void main(String[] args) {
        DialogCursorTest test = new DialogCursorTest();
        test.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        test.setSize(400, 300);
        test.setVisible(true);
    }
}
0 голосов
/ 23 февраля 2010

Я нашел решение: проблема была в том, что у меня был 1 кадр и 1 диалог. Фрейм является основным, диалог создается позже. Из диалога я вызываю new JDialog(null, "title"); Вместо использования нуля, я должен был добавить диалог вызова, потому что после закрытия диалога фокус переместился на основной кадр, хотя на моем Mac это выглядело так, как будто фокус был на диалоге. ...

...