У меня есть постоянное окно, которое я хочу оставить над всеми остальными окнами. Использование 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 );
}
}
}