Выпадающее меню JComboBox не подчиняется AlwaysOnTop

У меня есть постоянное окно, которое я хочу оставить над всеми остальными окнами. Использование setAlwaysOnTop(true), кажется, работает для большинства целей, но терпит неудачу, когда дело доходит до выпадающих меню JComboBox. Есть ли способ предотвратить это? Ниже прилагается SSCCE и изображение нежелательной функциональности.

РЕДАКТИРОВАТЬ: Не уверен, что поведение зависит от ОС, но я замечаю проблему в Windows 7 с использованием Java 7. В этой ОС поддерживается сверху.

РЕДАКТИРОВАТЬ 2: кажется, что JPopupMenu имеет переопределение для alwaysOnTop(), чтобы вернуть true. Это источник проблемы, так как у верхних компонентов нет определенного порядка в том, как они появляются друг над другом (зависит от ОС). Что еще хуже, этот метод является частным пакетом. Довольно проблематично...

Нежелательное поведение:

Нежелательное поведение

SSCCE:

import java.awt.BorderLayout;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JTextField;

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

    public OnTopTest()
    {
        JDialog onTop = new OnTopWindow();
        JDialog other = new OtherWindow();

        System.out.println("IS ON TOP SUPPORTED? " + onTop.isAlwaysOnTopSupported());

        other.setVisible( true );
        onTop.setVisible( true );
    }


    private class OnTopWindow extends JDialog
    {
        public OnTopWindow()
        {
            setLayout( new BorderLayout() );

            JButton button = new JButton("Button");
            add( button, BorderLayout.CENTER );

            setSize( 100, 100 );

            setAlwaysOnTop( true );
        }
    }

    private class OtherWindow extends JDialog
    {
        public OtherWindow()
        {
            setLayout( new BorderLayout() );

            JTextField textField = new JTextField("Text");
            add( textField, BorderLayout.NORTH);

            JButton button = new JButton("Button");
            add( button, BorderLayout.CENTER );

            JComboBox comboBox = new JComboBox( new Object[] {"Item1", "Item2", "Item3"} );
            add( comboBox, BorderLayout.SOUTH );

            setSize( 200, 200 );
        }
    }
}

person Ironcache    schedule 10.02.2015    source источник
comment
Если бы JComboBox не находился внизу окна, вы могли бы сделать его облегченный. Другая возможность, если у вас нет большого количества элементов данных, заключается в использовании JRadioButtons вместо JComboBox, поскольку они функционально идентичны (элемент управления выбором «один из многих»).   -  person VGR    schedule 11.02.2015
comment
Хороший колл в легком весе. Переместил поле со списком наверх, и оно работает нормально (компоненты по умолчанию облегченные, если они не выходят за границы кадра, казалось бы?). Спасибо ВГР.   -  person Ironcache    schedule 11.02.2015
comment
это правильный вывод, все контейнеры всплывающих окон являются тяжелыми, затем переходят на передний план, еще одно ограничение, на экране может быть виден нежелательный только один экземпляр всплывающего окна, то же самое с потерянным фокусом, для извлечения всплывающего окна (BasicComboPopup) для замены легкого компонента (с пакетом)   -  person mKorbel    schedule 11.02.2015
comment
@Ironcache, у тебя когда-нибудь это работало?   -  person Jean-François Savard    schedule 06.03.2015
comment
@ Жан-Франсуа Савар Не совсем так. Он может работать по умолчанию, если поле со списком находится в пределах контейнера (IE: компонент легкий). Если поле со списком выходит за пределы контейнера, компонент по своей сути является тяжеловесным, и его поведение не зависит от Java. Принятие вашего ответа.   -  person Ironcache    schedule 07.08.2015


Ответы (1)


Я почти уверен, что это обрабатывается операционной системой и что Java не может заставить dropdown не перекрывать другое окно, так как поиск этого без указания Java сообщал об одном и том же поведении на многих разных языках.

Вы можете проверить с помощью JMenu для подтверждения, но я уверен, что это также произойдет, поскольку меню и некоторые другие элементы управления (например, раскрывающиеся списки) будут (по необходимости) отображаться над любым другим окном.

person Jean-François Savard    schedule 10.02.2015
comment
Это верно, если поле со списком имеет большой вес, что по своей сути является в данном случае, поскольку оно выходит за пределы JFrame. Если у вас есть контроль над положением поля со списком и вы можете разместить его внутри контейнера, вы можете сделать его облегченным (что дает Java контроль над ОС, поскольку на самом деле это не создает новое окно уровня ОС). - person Ironcache; 07.08.2015