如何在 JLabel 上创建悬停以显示菜单栏


如何

使它在用户将光标悬停在 JLabel 上时显示菜单栏?我对鼠标事件等有点困惑。所以这是代码:

public class MenuPage extends JFrame implements ActionListener
{
    private JLabel fShirts, tShirts, sweater, jeans, shoes, hats, bags;
    private JButton btnCart, btnExit;
    private JPanel leftPane, rightPane;
    private Container cont;
    public MenuPage()
    {
        super ("Menu");
        cont = getContentPane();
        cont.setLayout (new BorderLayout());
        fShirts = new JLabel ("Formal Shirts", SwingConstants.CENTER);
        tShirts = new JLabel ("T - Shirts", SwingConstants.CENTER);
        sweater = new JLabel ("Sweater", SwingConstants.CENTER);
        jeans = new JLabel ("Jeans", SwingConstants.CENTER);
        shoes = new JLabel ("Shoes", SwingConstants.CENTER);
        hats = new JLabel ("Hats", SwingConstants.CENTER);
        bags = new JLabel ("Bags", SwingConstants.CENTER);
        btnCart = new JButton ("Cart");
        btnExit = new JButton ("Exit");
        leftPane = new JPanel();
        leftPane.setLayout (new GridLayout (9,1));
        leftPane.setBorder (new TitledBorder ("Menus"));

        cont.add (leftPane, BorderLayout.WEST);
        leftPane.add (fShirts);
        leftPane.add (tShirts);
        leftPane.add (sweater);
        leftPane.add (jeans);
        leftPane.add (shoes);
        leftPane.add (hats);
        leftPane.add (bags);
        leftPane.add (btnCart);
        leftPane.add (btnExit);
        leftPane.setOpaque (true);
        btnCart.addActionListener(this);
        btnExit.addActionListener(this);
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        validate();
    }
    public void actionPerformed(ActionEvent menu)
    {
        {
            if (menu.getSource() == btnCart)
            {
                dispose();
            }
            else if (menu.getSource() == btnExit)
            {
                dispose();
                new WelcomePage();
            }
        }
    }
    public static void main(String args[])
    {
        MenuPage wp = new MenuPage();
    }
}

如何使标签在用户将光标悬停在每个标签上时显示菜单栏?

只需实现一个MouseListener(或MouseAdapter,这很方便):

 fShirts.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseExited(MouseEvent e) {
            System.out.println("hide menu");
        }
        @Override
        public void mouseEntered(MouseEvent e) {
            System.out.println("show menu");
        }
    });

顺便说一句,你的代码结构会像这样干净得多(除非你真的需要对标签的引用,我对此表示怀疑):

public class MenuPage extends JFrame implements ActionListener {
    private JButton                     btnCart, btnExit;
    private JPanel                      leftPane, rightPane;
    private Container                   cont;
    private static final List<String>   LABELS_TEXT = Arrays.asList("Formal Shirts","T - Shirts", //
                                                            "Sweater","Jeans","Hats","Bags");
    public MenuPage() {
        super("Menu");
        cont = getContentPane();
        cont.setLayout(new BorderLayout());
        leftPane = new JPanel();
        leftPane.setLayout(new GridLayout(9,1));
        leftPane.setBorder(new TitledBorder("Menus"));
        List<JPopupMenu> popMenus = buildPopMenus();
        for (int i=0 ; i<LABELS_TEXT.size() ; i++) {
            final int j = i;
            JLabel label = new JLabel(LABELS_TEXT.get(i),SwingConstants.CENTER);
            label.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseExited(MouseEvent e) {
                    popMenus.get(j).setVisible(false);
                }
                @Override
                public void mouseEntered(MouseEvent e) {
                    Point loc = label.getLocationOnScreen();
                    loc.translate(label.getWidth(),label.getHeight());
                    popMenus.get(j).setLocation(loc);
                    popMenus.get(j).setVisible(true);
                }
            });
            leftPane.add(label);
        }
        btnCart = new JButton("Cart");
        btnExit = new JButton("Exit");
        cont.add(leftPane,BorderLayout.WEST);
        leftPane.setOpaque(true);
        btnCart.addActionListener(this);
        btnExit.addActionListener(this);
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        validate();
    }
    private List<JPopupMenu> buildPopMenus() {
        return LABELS_TEXT.stream().map(text -> { 
            JPopupMenu popMenu = new JPopupMenu();
            popMenu.add(new JMenuItem(text));
            return popMenu;
        })
        .collect(Collectors.toList());
    }
    public void actionPerformed(ActionEvent menu) {
        if (menu.getSource() == btnCart) {
            dispose();
        }
        else if (menu.getSource() == btnExit) {
            dispose();
            // new WelcomePage();
        }
    }
    public static void main(String args[]) {
        MenuPage wp = new MenuPage();
    }
}

最新更新