Java JMenu向上打开而不是向下打开

fkvaft9z  于 2023-02-11  发布在  Java
关注(0)|答案(1)|浏览(111)

我需要显示一个向上而不是向下打开的Java JMenu。我正在创建一个底部带有工具栏(带有JMenuBar)的应用程序,在扩展显示中运行,与其他应用程序共享。我的应用程序必须显示在屏幕区域的顶部,因此使用JMenu的默认设置会导致向下打开的菜单与屏幕底部运行的其他应用程序区域重叠。
有人能帮我找到正确的方法来强制菜单向上打开吗?
我尝试使用JMenu类的setLocation方法,我希望菜单在我给出的坐标处打开,但它不起作用。我还研究了BoxLayout特性,但它没有帮助。

idfiyjo8

idfiyjo81#

可以使用MenuListener将弹出菜单的位置重置为显示在菜单上方:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class MenuPopupUpListener implements MenuListener
{
    @Override
    public void menuSelected(MenuEvent e)
    {
        SwingUtilities.invokeLater(() ->
        {
            JMenu menu = (JMenu)e.getSource();
            JPopupMenu popup = menu.getPopupMenu();

            Rectangle bounds = popup.getBounds();
            Point location = menu.getLocationOnScreen();

            location.y -= bounds.getHeight();
            popup.setLocation(location);
        });
    }

    @Override
    public void menuCanceled(MenuEvent e) {}

    @Override
    public void menuDeselected(MenuEvent e) {}

    private static void createAndShowGUI()
    {
        JMenuBar menuBar = new JMenuBar();
        JMenu menu = new JMenu("Menu 1");
        menuBar.add( menu );

        menu.add( new JMenuItem( "MenuItem 1a" ) );
        menu.add( new JMenuItem( "MenuItem 1b" ) );
        menu.add( new JMenuItem( "MenuItem 1c" ) );

        //  Add a listener to all menus to have the popup open above the menu

        MenuListener ml = new MenuPopupUpListener();
        menu.addMenuListener( ml );

        JFrame frame = new JFrame("MenuPopupUp");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(menuBar, BorderLayout.PAGE_END);
        frame.setLocationByPlatform( true );
        frame.setSize(300, 300);
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        java.awt.EventQueue.invokeLater( () -> createAndShowGUI() );
    }
}

侦听器需要添加到所有菜单中。

相关问题