4

他のすべてのウィンドウの上に残しておきたい、常に最前面に表示されるウィンドウがあります。setAlwaysOnTop(true) を使用すると、ほとんどの目的で機能するように見えますが、JComboBox ドロップダウン メニューに関しては失敗します。これを防ぐ方法はありますか?以下に添付されているのは、望ましくない機能の SSCCE と写真です。

編集: 動作が OS に依存するかどうかはわかりませんが、Java 7 を使用している Windows 7 で問題に気付いています。この OS では上がサポートされています。

編集 2: JPopupMenu には true を返すように alwaysOnTop() のオーバーライドがあるようです。これが問題の原因です。これが問題の原因です。これは、最上位のコンポーネントが互いの上に表示される順序が定義されていないためです (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 );
        }
    }
}
4

1 に答える 1