Модальный JDialog скрывается за родителем на CDE Solaris - PullRequest
1 голос
/ 21 апреля 2011

Мой код содержит JFrame, который после определенного действия отображает немодальный JDialog. Ожидается, что пользователь перетянет объект из JFrame в JDialog. У меня проблема, которая появляется только в Solaris CDE (Common Desktop Environment): открытие JDialog правильно размещает окно в верхней части фрейма. После того, как пользователь нажимает на фрейм, за ним исчезает диалоговое окно, вынуждая пользователя изменить положение фрейма, чтобы поместить его помимо JDialog. Ожидаемое поведение - JDialog остается поверх родительского фрейма.

Следующий код демонстрирует ситуацию:

public class MyFrame extends JFrame
{

    public MyFrame()
    {
        JButton btn = new JButton("Push me");
        btn.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e)
            {
                JDialog dialog = new JDialog(MyFrame.this);
                dialog.getContentPane().add(new JLabel("I'm a dialog!!!"));
                dialog.setAlwaysOnTop(true);
                dialog.setVisible(true);
            }

        });

        getContentPane().add(btn);
        pack();
    }

    public static void main(String args[])
    {
        MyFrame frame = new MyFrame();

        frame.setVisible(true);


    }
}

Эта проблема не при запуске какого-либо другого оконного менеджера на солярисе, а также windows и linux (GNOME). Подобный вопрос был задан некоторое время назад ( Как сделать так, чтобы немодальное диалоговое окно оставалось поверх его родительского элемента в Solaris CDE ), но оно остается нерешенным.

1 Ответ

1 голос
/ 21 апреля 2011

Оба JFrame и JDialog наследуют следующие Window удобные методы: toFront () и toBack () , хотя JDialog наследует последний от Dialog. В любом случае, попробуйте использовать любой из них в сочетании с WindowListener , прослушивая следующие события: windowActivation (WindowEvent e) и windowDeactivited (WindowEvent e) .

Edit:

Это то, что кто-то еще предложил ,

прикрепить слушателя фокуса к JDialog и когда он теряет фокус, переместите его в передняя часть всех других окон. Это вызовет мерцание и работает довольно ужасно.

...