У меня есть окно, которое я всегда останусь над всеми остальными окнами. Использование setAlwaysOnTop (true), похоже, работает для большинства целей, но не работает, когда дело доходит до выпадающего меню JComboBox. Есть ли способ предотвратить это? Ниже прилагается SSCCE и изображение нежелательной функциональности.Выпадающее меню JComboBox, не подчиняющееся AlwaysOnTop
EDIT: Не уверен, что поведение зависит от ОС, но я замечаю проблему в Windows 7 с использованием Java 7. Наверху поддерживается эта ОС.
EDIT 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);
}
}
}
Если JComboBox не находится в нижней части окна, вы можете сделать его [легким] (http://docs.oracle.com/javase/8/docs/api/javax/swing/JComboBox.html#setLightWeightPopupEnabled -boolean-). Другая возможность, если у вас нет большого количества элементов данных, заключается в использовании JRadioButtons вместо JComboBox, поскольку они функционально идентичны (один из многих элементов управления выбором). – VGR
Хороший звонок на легкий вес. Перемещено поле со списком вверх, и оно отлично работает (компоненты по умолчанию легкие, если они не выходят за рамки рамки, это может показаться?). Спасибо VGR. – Ironcache
thats correct output, все контейнеры Popup имеют супертяжелый вес, а затем идут в Forefront, другое ограничение, нежелательно, только один экземпляр всплывающего окна может быть виден на креане, то же самое с потерянным фокусом, чтобы извлечь всплывающее окно (BasicComboPopup) в chanche islightweightcomponent (с пакетом) – mKorbel