JComboBox 下拉菜单不遵守 AlwaysOnTop
JComboBox Dropdown Menu Not Obeying AlwaysOnTop
我有一个永远在线的 window,我想保持在所有其他 windows 之上。使用 setAlwaysOnTop(true) 似乎适用于大多数用途,但在涉及 JComboBox 下拉菜单时会失败。有什么办法可以防止这种情况发生吗?下面附上了一个 SSCCE 和不需要的功能的图片。
编辑:不确定该行为是否依赖于 OS,但我注意到 Windows 7 上使用 Java 7 的问题。在此 OS.
编辑 2:似乎 JPopupMenu 将 alwaysOnTop() 覆盖为 return true。这是问题的根源,因为顶层组件在它们如何出现在彼此之上(OS 依赖)没有定义的顺序。更糟糕的是,该方法是包私有的。很有问题...
不良行为:
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 );
}
}
}
我很确定这是由操作系统处理的,Java
不能强制 dropdown
不与另一个 window 重叠,因为搜索时没有指定 Java
在许多不同的语言中报告了相同的行为。
您可以使用 JMenu
进行测试以确认,但我相信它也会发生,因为菜单和其他一些控件(如下拉菜单)将(必要时)显示在任何其他控件之上 window.
我有一个永远在线的 window,我想保持在所有其他 windows 之上。使用 setAlwaysOnTop(true) 似乎适用于大多数用途,但在涉及 JComboBox 下拉菜单时会失败。有什么办法可以防止这种情况发生吗?下面附上了一个 SSCCE 和不需要的功能的图片。
编辑:不确定该行为是否依赖于 OS,但我注意到 Windows 7 上使用 Java 7 的问题。在此 OS.
编辑 2:似乎 JPopupMenu 将 alwaysOnTop() 覆盖为 return true。这是问题的根源,因为顶层组件在它们如何出现在彼此之上(OS 依赖)没有定义的顺序。更糟糕的是,该方法是包私有的。很有问题...
不良行为:
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 );
}
}
}
我很确定这是由操作系统处理的,Java
不能强制 dropdown
不与另一个 window 重叠,因为搜索时没有指定 Java
在许多不同的语言中报告了相同的行为。
您可以使用 JMenu
进行测试以确认,但我相信它也会发生,因为菜单和其他一些控件(如下拉菜单)将(必要时)显示在任何其他控件之上 window.