Как установить всплывающую подсказку для JMenuItem? - PullRequest
1 голос
/ 10 февраля 2020

У меня есть JMenuItem с иконкой для него. Я хочу добавить подсказку только для этого значка. Я не могу найти никакого решения для этого. Это то, что я реализовал до сих пор.

JMenuItem mnuItem = new JMenuItem(Aaction a);
ImageIconn img = new ImageIcon(String filename);
mnuItem.setIcon(img);

Я хотел бы добавить всплывающую подсказку только для иконки.

1 Ответ

1 голос
/ 10 февраля 2020

В основном @MadProgrammer прав. Но некоторые взломы Swing позволили мне найти решение для вас. Вот оно:

import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;

import javax.swing.Action;
import javax.swing.Icon;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.WindowConstants;

/**
 * <code>TestMenuItem</code>.
 */
public class TestMenuItem {

    private static final String ICON_RECT = "iconRect";

    private static class IconDelegate implements Icon {

        private Icon delegate;

        public IconDelegate(Icon delegate) {
            this.delegate = delegate;
        }

        @Override
        public void paintIcon(Component c, Graphics g, int x, int y) {
            delegate.paintIcon(c, g, x, y);
            if (c instanceof JComponent) {
                // save last point where the icon was shown in the menu item
                ((JComponent) c).putClientProperty(ICON_RECT, new Point(x, y));
            }
        }

        @Override
        public int getIconWidth() {
            return delegate.getIconWidth();
        }

        @Override
        public int getIconHeight() {
            return delegate.getIconHeight();
        }
    }

    private static class IconTooltipItem extends JMenuItem {

        /**
         * 
         */
        public IconTooltipItem() {
            super();
        }

        /**
         * @param a
         */
        public IconTooltipItem(Action a) {
            super(a);
        }

        /**
         * @param text
         * @param icon
         */
        public IconTooltipItem(String text, Icon icon) {
            super(text, icon);
        }

        @Override
        public String getToolTipText(MouseEvent event) {
            // get the icon point
            Point p = (Point) getClientProperty(ICON_RECT);
            boolean shouldShow = true;
            if (p != null && getIcon() != null) {
                Rectangle rect = new Rectangle(p, new Dimension(getIcon().getIconWidth(), getIcon().getIconHeight()));
                // show only when mouse is in the icon rectangle.
                shouldShow = rect.contains(event.getPoint());
            }
            return shouldShow ? super.getToolTipText(event) : null;
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(TestMenuItem::startUp);
    }

    private static void startUp() {
        Icon icn = UIManager.getIcon("OptionPane.informationIcon");
        JMenuBar bar = new JMenuBar();
        JMenu menu = new JMenu("Menu");
        JMenuItem item = new IconTooltipItem("Information", new IconDelegate(icn));
        item.setToolTipText("Information item");
        bar.add(menu);
        menu.add(item);
        JFrame frm = new JFrame("IconItem");
        frm.setSize(500, 500);
        frm.setJMenuBar(bar);
        frm.setLocationRelativeTo(null);
        frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frm.setVisible(true);
    }
}
...