2015-02-10 2 views
4

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

EDIT: Не уверен, что поведение зависит от ОС, но я замечаю проблему в Windows 7 с использованием Java 7. Наверху поддерживается эта ОС.

EDIT 2: Кажется, что JPopupMenu имеет переопределение на alwaysOnTop(), чтобы вернуть true. Это является источником проблемы, поскольку на верхних компонентах нет определенного порядка в том, как они появляются друг над другом (зависит от ОС). Хуже того, этот метод является приватным пакетом. Довольно проблематично ...

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

Undesired Behavior

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); 
     } 
    } 
} 
+1

Если JComboBox не находится в нижней части окна, вы можете сделать его [легким] (http://docs.oracle.com/javase/8/docs/api/javax/swing/JComboBox.html#setLightWeightPopupEnabled -boolean-). Другая возможность, если у вас нет большого количества элементов данных, заключается в использовании JRadioButtons вместо JComboBox, поскольку они функционально идентичны (один из многих элементов управления выбором). – VGR

+0

Хороший звонок на легкий вес. Перемещено поле со списком вверх, и оно отлично работает (компоненты по умолчанию легкие, если они не выходят за рамки рамки, это может показаться?). Спасибо VGR. – Ironcache

+0

thats correct output, все контейнеры Popup имеют супертяжелый вес, а затем идут в Forefront, другое ограничение, нежелательно, только один экземпляр всплывающего окна может быть виден на креане, то же самое с потерянным фокусом, чтобы извлечь всплывающее окно (BasicComboPopup) в chanche islightweightcomponent (с пакетом) – mKorbel

ответ

0

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

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

+1

Это верно, если поле со списком - это тяжелый вес, который по сути является в этом случае, поскольку он выходит за пределы JFrame. Если вы контролируете положение поля со списком и можете сделать его пригодным в контейнере, вы можете сделать его легким (что дает Java контроль над ОС, поскольку он фактически не создает новое окно уровня ОС). – Ironcache

Смежные вопросы