Предотвратить появление JWindow поверх всех окон

Я использую JWindow в своем проекте для отображения пользовательского интерфейса, который не оформлен и также не отображается на панели задач. Но JWindow всегда кажется поверх всех остальных окон. Я попытался установить для setAlwaysOnTop значение false, но это не помогло.

Вот код, который может воспроизвести проблему:

package test;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JWindow;

public class Test extends JWindow implements ActionListener {

    public Test() {
        setSize(300, 300);
        setLocationRelativeTo(null);
        setAlwaysOnTop(false);

        JButton myButton = new JButton("Click Here");
        myButton.addActionListener(this);
        getContentPane().add(myButton);

        setVisible(true);
    }

    public static void main(String[] args) {
        new Test();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getActionCommand().equals("Click Here"))
            JOptionPane.showMessageDialog(this, "This dialog box appears behind the JWindow!");
    }
}

Моя ОС — Linux, и я использую Oracle JDK 6. Кроме того, когда я тестировал свое приложение в Windows, я использовал JDialog для пользовательского интерфейса, и он работал нормально. Но в Linux JDialog появляется на панели задач.

Любая помощь, как решить эту проблему?


person Karthik Prabhu    schedule 06.02.2013    source источник
comment
Я не думаю, что это проблема модальности. Я могу получить доступ к другим окнам, а также к приложениям, когда JWindow находится сверху. Но JWindow не возвращается, он всегда остается наверху.   -  person Karthik Prabhu    schedule 07.02.2013


Ответы (1)


После того, как вы установили для видимости окна значение True, вы отправляете его на задний план следующим образом:

setVisible(true);
toBack();

Если позже вы захотите вывести его на вершину порядка укладки, вы просто вызываете:

toFront();

Подробнее здесь:

http://docs.oracle.com/javase/6/docs/api/java/awt/Window.html#toBack()

http://docs.oracle.com/javase/6/docs/api/java/awt/Window.html#toFront()

person Alexandru Chirila    schedule 06.02.2013
comment
Спасибо за ответ, но когда я делаю toBack(), он только отправляет его обратно в порядке укладки в приложении. JWindow по-прежнему остается поверх всех других запущенных приложений. - person Karthik Prabhu; 06.02.2013
comment
О, теперь я понимаю, ну, это в основном проблема ОС, потому что виртуальная машина JAVA не имеет доступа к визуальному декоратору ОС. Также в документации: docs.oracle.com/javase/1.5.0/docs/api/java/awt/ вы увидите это примечание: некоторые платформы могут не поддерживать окна Always-on-top. Общедоступного API для определения того, поддерживает ли платформа функцию Always-On-Top во время выполнения, не существует. - person Alexandru Chirila; 06.02.2013
comment
Кроме того, какая панель задач в Linux? Вы говорите, что ваша ОС — Linux, это неправильно, ядро ​​вашей ОС — Linux, но ОС — что-то другое (Ubuntu, Fedora, OpenSuse, Debian и т. д.). Все эти дистрибутивы работают с разными (возможно, настраиваемыми) декораторы, и, как я уже сказал, виртуальная машина Java не имеет к ним доступа. Если вы хотите исследовать это дальше, узнайте, какую ОС и декоратор вы используете, и, возможно, узнайте о них больше. Хотя я не вижу веских причин, по которым вам может понадобиться такая вещь, я полагаю, что она у вас есть. Также, если вы объясните, зачем вам это нужно, мы можем предложить вам альтернативу. - person Alexandru Chirila; 06.02.2013
comment
Извините, я хотел сказать Linux Mint. А еще моя среда рабочего стола — Mate. По сути, я разрабатываю приложение для заметок, которое использует системный трей в качестве основного пользовательского интерфейса для управления приложением. Я использовал JDialog для создания заметок. Но в Linux (я пробовал и другие среды рабочего стола) он виден на панели задач, что в данном случае нежелательно. Итак, теперь я использую JWindow, но он остается поверх всех окон. Вы можете ознакомиться с проектом здесь: JStickies - person Karthik Prabhu; 06.02.2013
comment
Хорошо, значит проблема не в том, что оно поверх других окон, а в появлении на панели задач. Взгляните на этот код github.com/ alexkiro/TimrDesktop/blob/master/TimrDesktop/src/ Это старая система уведомлений для домашнего задания. Он создает небольшое окно с уведомлением, срок действия которого истекает через несколько секунд. Это уведомление не появится на панели задач (насколько я помню). Код может быть немного запутанным, но я надеюсь, что это поможет. Это как-то связано с настройкой основного компонента окна на JPanel вместо JFrame. - person Alexandru Chirila; 06.02.2013
comment
Нет, я переключил свое приложение на JWindow, поэтому теперь оно не отображается на панели задач. В настоящее время проблема заключается в том, что JWindow находится поверх всех окон, за исключением любых фреймов или диалогов, которые я создаю в своем приложении. - person Karthik Prabhu; 06.02.2013